java – 两种JDBC查询批处理方法中的哪一种更快?
作者:互联网
我试图在具有数百万条记录的表上使用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();
}
我认为第二种方法更清洁,因为它在每批次之后提交,但是第一种方法比第二种方法花费的时间少得多.
有人可以向我解释为什么会这样吗?或者,如果我的方法和理解有任何错误.
解决方法:
Can someone explain to me why this is so?
这里可以优化许多不同的东西:
> JDBC / ODBC驱动程序和db引擎完成的工作准备和
解析声明
>客户端和数据库服务器之间的往返流量
> db引擎打开和关闭的工作(即提交
或回滚)一个交易
您的示例是优化不同的东西:
>通过使用绑定参数(如第二个示例中所示),仅限您
准备一次声明,这减少了所做的工作
ODBC / JDBC驱动程序,也可能是数据库引擎.
>通过较少经常执行批次(第一个示例),您正在减少
客户端和服务器之间的往返次数.
>通过较少提交(再次提供第一个例子),您将减少数量
数据库需要打开和关闭事务的次数.
正如您所发现的那样,瓶颈成为开仓和平仓交易的开销.多次往返也没有帮助.这些比不使用绑定参数更昂贵.
令人高兴的是,在这个例子中,您可以优化所有这三件事.您可以使用绑定参数,一次性将所有命令发送到数据库,然后执行单个提交.请参阅Jean de Lavarene的答案.
请注意行为的变化:如果您在一个批处理中提交,则一个错误将导致批处理中的所有内容回滚.这可能正是您想要的,但如果没有,这些考虑可能优先于性能.
标签:java,oracle,jdbc,batch-processing 来源: https://codeday.me/bug/20190824/1704439.html