JDBC + Java - 批量更新疑点

时间:2018-04-11 12:45:11

标签: java sql oracle jdbc

我正在使用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();

1 个答案:

答案 0 :(得分:2)

  

执行批处理的方法更好。

PreparedStatement.addBatch将当前参数插入批处理

  

为此PreparedStatement对象的一批命令添加一组参数。

preparedStatement.executeBatch将当前批次发送到数据库。

  

向数据库提交一批命令以供执行

所以你的代码没有相同的逻辑。只需将1/3的插入查询添加到批处理中。另一个将每3次迭代执行批处理。

我会建议两者混合,将每次迭代添加到批处理中,每次#iteration,执行它:

SchedulingConfigurer

请注意,批量3可能不是必需的,你可以大幅增加价值,但我真的不知道一种方法来“估计”批量的大小是有效的,我通常使用一个批量1000件但这不是理所当然的......

  

在preparedStatement.executeBatch期间究竟发生了什么?它每批只执行一次插入吗?

我总是看到像包一样的批次。

  1. 您使用地址(创建PreparedStatement)
  2. 编写标签
  3. 你拿一个盒子贴上地址
  4. 您在框中填入参数(多个addBatch)
  5. 如果框太小,则发送当前框(executeBatch)
  6. 如果仍有要发送的项目,请在第2点重新启动
  7. 我们的想法是使用包/批来限制JDBC和DB之间的通信次数。

    这是如何在幕后工作的并不是真正的责任,不应该真正关注。