如何在Statement.ExecuteBatch()中处理坏的或重复的记录



我有一个java程序,它处理一个有100万条记录的文件,并使用大容量插入将其插入到表中,即Statement.addbatch(),然后Statement.executeBatch()在每1000条记录之后。这个程序运行得很快。

但是,如果有重复的记录,即表引发异常,则整个批处理将消失,其余记录将不可跟踪。

即使我得到了updatecount()是没有帮助的,因为我不能插入重复到另一个表等。

是否有一种方法,在1000个特定的批插入中,如果有一条坏记录,那么该批中的每条记录可以一一处理,以便坏/重复记录可以放在另一个表中,而非重复记录可以放在常规表中?

我可以使用其他的类吗?我知道在c++中,Oracle提供了OCI,它可以处理批处理中的单个记录(称为主机数组操作),但在Java中,批量插入通常由Statement.adding在循环中完成,然后使用Statement.executeBatch()插入。

谢谢。

我会把它分成1000个小块,像这样

  final int BATCH_SIZE = 1000;
  for (int i = 0; i < DATA_SIZE; i++) {
   statement.setString(1, "a@a.com");
   statement.setLong(2, 1);
   statement.addBatch();
   if (i % BATCH_SIZE == BATCH_SIZE - 1)
   statement.executeBatch();
  }
  if (DATA_SIZE % BATCH_SIZE != 0)
  statement.executeBatch();

在一批记录中包含少量不良记录是很常见的。如果您尝试一次插入所有记录,并且其中一条记录失败,那么整个插入将被拒绝。这是预期的,也是"事务处理"的核心目的。

通常对于批处理插入,您可以采用两种方法:

1)每次记录插入后提交->非常性能密集型的过程。

2)将总记录分成更小的"块"并插入数据库。因此,只有包含坏记录的块将失败,其他块将被插入到数据库中。

或者,如果你不想自己处理这些事情,那就使用框架。Spring batch

可以是你的选项之一

相关内容

  • 没有找到相关文章

最新更新