程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2021-07-21 07:54     阅读(1150)     评论(0)     点赞(8)     收藏(4)


我正在尝试在具有数百万条记录的表上使用 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();
}

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

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


解决方案


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

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

  1. JDBC/ODBC 驱动程序和数据库引擎为准备和解析语句所做的工作
  2. 客户端和数据库服务器之间的往返流量
  3. 数据库引擎为打开和关闭(即提交或回滚)事务所做的工作

你的例子正在优化不同的东西:

  • 通过使用绑定参数(如在您的第二个示例中),您只需准备一次语句,这减少了 ODBC/JDBC 驱动程序和数据库引擎所做的工作。
  • 通过减少执行批处理(第一个示例),您可以减少客户端和服务器之间的往返次数。
  • 通过减少提交(再次是第一个示例),您可以减少数据库打开和关闭事务所需的次数。

正如您所发现的,瓶颈是打开和关闭事务的开销。多次往返也无济于事。这些比不使用绑定参数更昂贵。

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

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



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/247838/4093bdd03c21f6368892/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

8 0
收藏该文
已收藏

评论内容:(最多支持255个字符)