我正在使用Oracle Database 12c和oracle.jdbc.driver.OracleDriver。
批量插入是如何工作的?我知道这是分组语句,但究竟是在prepareStatement.executeBatch期间发生了什么?它每批只执行一次插入吗?
执行批处理的方法更好。这个执行外部循环:
PreparedStatement ps = c.prepareStatement("insert into some_tab(id, val) values (?, ?);");
for (int i = 0; i < 3000; i++) {
ps.setLong(1, i);
ps.setString(2, "value" + i);
if ((i + 1) % 3 == 0) {
ps.addBatch();
}
}
ps.executeBatch();
或者这个 - 循环执行:
PreparedStatement ps = c.prepareStatement("insert into some_tab(id, val) values (?, ?);");
for (int i = 0; i < 3000; i++) {
ps.setLong(1, i);
ps.setString(2, "value" + i);
ps.addBatch();
if ((i + 1) % 3 == 0) {
ps.executeBatch();
}
}
ps.executeBatch();
答案 0 :(得分:2)
执行批处理的方法更好。
PreparedStatement.addBatch
将当前参数插入批处理
为此PreparedStatement对象的一批命令添加一组参数。
preparedStatement.executeBatch
将当前批次发送到数据库。
向数据库提交一批命令以供执行
所以你的代码没有相同的逻辑。只需将1/3的插入查询添加到批处理中。另一个将每3次迭代执行批处理。
我会建议两者混合,将每次迭代添加到批处理中,每次#iteration,执行它:
SchedulingConfigurer
请注意,批量3可能不是必需的,你可以大幅增加价值,但我真的不知道一种方法来“估计”批量的大小是有效的,我通常使用一个批量1000件但这不是理所当然的......
在preparedStatement.executeBatch期间究竟发生了什么?它每批只执行一次插入吗?
我总是看到像包一样的批次。
我们的想法是使用包/批来限制JDBC和DB之间的通信次数。
这是如何在幕后工作的并不是真正的责任,不应该真正关注。