使用PreparedStatement时executeBatch()和executeLargeBatch()之间的区别

问题描述 投票:0回答:2

我很困惑何时使用

executeBatch()
executeLargeBatch()
。 我浏览了 Java 文档,发现唯一的区别是:

当返回的行数可能超过

executeLargeBatch()

 时,应使用 
Integer.MAX_VALUE

我将

executeBatch()
替换为
executeLargeBatch()
,但尚未发现任何性能改进。

处理

Integer.MAX_VALUE
是唯一的目的吗?其中一种相对于另一种是否有任何性能优势?

java sql batch-processing
2个回答
22
投票

您引用的差异差异:

executeBatch
返回
int[]
以返回每次更新的计数。
executeLargeBatch
返回
long[]
以返回每次更新的计数。因此,文档说如果计数可能超出
int
的容量,则使用后者。例如,它们是
executeUpdate
(返回
int
)和
executeLargeUpdate
(返回
long
)的批处理等价物。

我不认为会有任何显着的性能差异;如果您可能更新超过 2,147,483,647 行,这只是一个不要溢出

int
的问题。


0
投票

从源码来看,

executeBatch()
实际上是在内部调用了
executeLargeBatch
,所以从性能角度来说,它们应该是一样的

public int[] executeBatch() throws SQLException {
  Monitor.CloseableLock lock = this.connection.acquireCloseableLock();
  Throwable var2 = null;

  int[] var3;
  try {
     var3 = this.toIntArray(this.executeLargeBatch());
  } catch (Throwable var12) {
     var2 = var12;
     throw var12;
  } finally {
     if (lock != null) {
        if (var2 != null) {
           try {
              lock.close();
           } catch (Throwable var11) {
              var2.addSuppressed(var11);
           }
        } else {
           lock.close();
        }
     }

  }

  return var3;

}

© www.soinside.com 2019 - 2024. All rights reserved.