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

Cla*_*ara 15 java sql jdbc prepared-statement

我有以下代码片段:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Bog*_*mac 14

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

调用executeBatch方法会关闭调用Statement对象的当前结果集(如果有的话).一旦executeBatch返回,语句的批处理将重置为空.

不幸的是,这样一个重要的细节几乎就像一个精美的印刷品.

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


T.J*_*der 8

我想说更相关的问题是批次是否被清除.虽然这似乎是一个合理的假设,但是除非文档明确说它已被清除(并且我没有看到任何executeBatch说法),我clearBatch明确地使用理论,如果实现确实清除了批处理,clearBatch将会很快无操作; 如果不是,那么我需要这样做.

更新:虽然executeBatch文档没有这样说,但请参阅Bogdan Calmac的回答:显然,JDBC文档确实说成功完成会清除批处理.


dhb*_*lah 8

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

executeBatch()电话clearBatch()到底.

但是不能保证在其他实现中完全相同.

  • *"但不能保证在其他实现中完全相同."*对,所以这不是真的有用. (2认同)