Java 如何处理Statement.ExecuteBatch()中的错误或重复记录

Java 如何处理Statement.ExecuteBatch()中的错误或重复记录,java,prepared-statement,ojdbc,batch-insert,Java,Prepared Statement,Ojdbc,Batch Insert,我有一个java程序,它处理一个包含100万条记录的文件,并使用批量插入将其插入表中,即语句.addbatch(),然后在每1000条记录之后插入语句.executeBatch()。这个程序运行得相当快 但是,如果存在重复记录,即该表引发异常,则整个批次将消失,其余记录将无法跟踪 即使我得到了updatecount()也没有帮助,因为我无法将重复项插入另一个表等 是否有一种方法,在一个1000的特定批插入中,如果有一个坏记录,那么该批中的每个记录都可以逐个处理,这样坏记录/重复记录可以放在另一个

我有一个java程序,它处理一个包含100万条记录的文件,并使用批量插入将其插入表中,即
语句.addbatch()
,然后在每1000条记录之后插入
语句.executeBatch()
。这个程序运行得相当快

但是,如果存在重复记录,即该表引发异常,则整个批次将消失,其余记录将无法跟踪

即使我得到了
updatecount()
也没有帮助,因为我无法将重复项插入另一个表等

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

还有别的课我可以用吗?我知道在C++中,Oracle提供了一个可以处理批处理中的单个记录的OCI(称为主机数组操作),但是在java中,批量插入通常是由<代码>语句来完成的。
谢谢

我会把它分成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();
final int BATCH_SIZE=1000;
对于(int i=0;i
一批记录中很少有坏记录是很常见的。如果您尝试一次性插入所有记录,但有一条记录失败,那么整个插入操作都将被拒绝。这是预期的,也是“交易处理”的核心目的

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

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

2) 将所有记录分成更小的“块”并插入数据库。因此,只有包含坏记录的块将失败,其他块将插入数据库

或者,如果你不想自己处理这些事情,那就找一个框架


在这种情况下,可能是您的选择之一

您可以在批处理旁边的某个容器中收集这1000个值,如果批处理失败,您可以自己一个一个地运行它们,不是吗?如果批处理成功,请清除容器并转到下一个1000,在每次插入后是否执行批处理?那么这一切的目的是什么呢?第二,如果我有小的块,然后如果一条记录失败,那么我仍然会丢失一些记录。要求不应丢失任何记录。每个记录都必须转到表中,或者为重复记录创建一个辅助表。