1

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

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

即使我得到updatecount()is 也无济于事,因为我无法将重复项插入另一个表等。

有没有一种方法,在 1000 个特定的批次插入中,如果有坏记录,那么该批次中的每条记录都可以一个一个地处理,以便可以将坏/重复记录放在另一个表中,并且非常规表中的重复项?

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

谢谢。

4

1 回答 1

0

我会把它分成 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)将总记录分成更小的“块”并插入数据库。这样只有包含坏记录的块将失败,而其他块将被插入到数据库中。

或者,如果您不想自己处理这些事情,请选择一个框架。春季批次

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

于 2014-07-28T07:08:42.417 回答