两种JDBC查询批处理方法中的哪一种更快?

时间:2016-06-01 21:52:43

标签: java oracle jdbc batch-processing

我正在尝试使用rownum在具有数百万条记录的表上多批次运行更新语句。

第一种方法是将所有查询一起批处理,然后运行executeBatch()方法,如下所示

for (i = num; i < limit; i += num) {
    String query = "update Table set someColumn ='T' where rownum<=" + i;
    preparedStatement = dbConnection.prepareStatement(query);
    preparedStatement.addBatch();
}
preparedStatement.executeBatch();
dbConnection.commit();

第二种方法是运行一个批量更新语句并在每个批次之后提交,如下所示,

String query = "update Table set someColumn ='T' where rownum<=?";
preparedStatement = dbConnection.prepareStatement(query);
int count = 1;
while (count > 0) {
    preparedStatement.setInt(1, num);
    count = preparedStatement.executeUpdate();
    dbConnection.commit();
}

我认为第二种方法更清洁,因为它在每批次之后提交,但第一种方法比第二种方法花费的时间少得多。

有人可以向我解释为什么会这样吗?或者,如果我的方法和理解中有任何错误。

3 个答案:

答案 0 :(得分:3)

使用相同预准备语句的不同绑定变量进行批处理:

Range("M2").Formula = Date() & "other formula part"

答案 1 :(得分:3)

  

有人可以向我解释为什么会这样吗?

这里可以优化许多不同的东西:

  1. 由JDBC / ODBC驱动程序和db引擎完成的工作来准备和 解析声明
  2. 客户端与数据库服务器之间的往返流量
  3. db引擎打开和关闭的工作(即提交 或回滚)交易
  4. 您的例子正在优化不同的事情:

    • 通过使用绑定参数(如第二个示例中所示),仅限您 准备一次声明,这减少了所做的工作 ODBC / JDBC驱动程序,也可能是数据库引擎。
    • 通过不经常执行批次(第1个示例),您正在减少 客户端和服务器之间的往返次数。
    • 通过较少提交(第一个例子),你减少了数量 数据库需要打开和关闭事务的次数。

    正如您所发现的那样,瓶颈最终成为开仓和平仓交易的开销。多次往返也没有帮助。这些比不使用绑定参数更昂贵。

    令人高兴的是,在这个例子中,您可以优化所有这三件事。您可以使用绑定参数,一次性将所有命令发送到数据库,然后执行单个提交。请参阅Jean de Lavarene的答案。

    请注意行为的变化:如果您在一个批处理中提交,则一个错误将导致批处理中的所有内容回滚。这可能正是您想要的,但如果没有,这些考虑可能优先于性能。

答案 2 :(得分:0)

使用一批。

逻辑原因:

除非您的提交大小的高水位标记超出服务器的日志限制(在这种情况下,您的事务将在部分时间内回滚),您可能希望所有语句成功完成或所有失败。解开部分数据库更新要困难得多,并且(根据您的情况),如果只有一些更新成功,您可能会将数据保持在不一致状态。

表现原因:

允许DB优化解析一个命令,协调所有活动,仅启动一个事务,并且只进行一次提交。

相关问题