编程语言
首页 > 编程语言> > java – 两种JDBC查询批处理方法中的哪一种更快?

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