在使用 Java ReadyStatemen 执行一批 SQL 命令后,参数值是否会自动清除?

2022-09-02 23:57:14

我有以下代码片段:

PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < 100000; i++) {
    preparedStatement.setObject(1, someValue);
    preparedStatement.addBatch();
    if ((i + 1) % 100 == 0) {
        preparedStatement.executeBatch();
    }
}

所以我想用不同的值执行一个命令大约100 000次。我的问题是:在每次调用 executeBatch() 后,PreparedStatement 中的参数是否被清除,或者我是否必须在调用 executeBatch() 后显式调用 preparedStatement.clearParameters()以确保只执行最后 100 个命令?


答案 1

是的。根据 JDBC 3.0 的第 15.1.2 节和 JDBC 4.1 的第 14.1.2 节:

调用方法 executeBatch 将关闭调用语句对象的当前结果集(如果一个结果集处于打开状态)。一旦 executeBatch 返回,语句的批处理将重置为空

不幸的是,如此重要的细节几乎以精美的印刷品告终。

除了已经提到的示例之外,jtds 驱动程序还在 executeBatch() 的最后块中执行 clearBatch()。


答案 2

正如我在这里看到的:http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/jdbc/odbc/JdbcOdbcStatement.java.html

executeBatch()最后打电话。clearBatch()

但不能保证在其他实现中会完全相同。


推荐