我有一个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
可以是你的选项之一