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

在使用Java PreparedStatemens执行一批SQL命令后,参数值是否自动清除?,java,sql,jdbc,prepared-statement,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) { preparedSta

我有以下代码片段:

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();
    }
}
PreparedStatement PreparedStatement=connection.prepareStatement(sql);
对于(int i=0;i<100000;i++){
setObject(1,someValue);
preparedStatement.addBatch();
如果((i+1)%100==0){
preparedStatement.executeBatch();
}
}

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

我想说,更相关的问题是批处理是否被清除。尽管这似乎是一个合理的假设,除非文档明确地说它已被清除(我看不出有任何关于这一点的说法),但我会明确地使用这样的理论,即如果实现确实清除了批,
clearBatch
将是一个快速的禁止操作;如果不行,那我就得去做

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

正如我在这里看到的:

executeBatch()
最后调用
clearBatch()


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

我更愿意说,最好明确地清除它。一些JDBC驱动程序在
executeBatch()之后不清除内部缓冲区
需要显式调用
clearBatch()
,以避免出现
IndexOutOfBoundException
之类的错误,因为可能还会引入一些逻辑错误


谢谢

是的。根据第15.1.2节和第14.1.2节:

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

不幸的是,这样一个重要的细节最终几乎成了一张精美的印刷品


除了前面提到的示例之外,jtds驱动程序还在.

的最后一块中执行clearBatch(),但不能保证在其他实现中会完全相同。“好的,所以这不是很有用。您对我下面发布的规范片段有何看法?您认为对于驱动程序开发人员来说,绑定是否足够(或足够清晰)?@BogdanCalmac我认为应该检查它选择的JDBC驱动程序行为。