异常:java.lang.ArrayIndexOutOfBoundsException或Oracle PreparedStatement
调用方法executeBatch时,我收到一个异常java.lang.ArrayIndexOutOfBoundsException:异常:java.lang.ArrayIndexOutOfBoundsException或Oracle PreparedStatement,java,prepared-statement,oracle12c,Java,Prepared Statement,Oracle12c,调用方法executeBatch时,我收到一个异常java.lang.ArrayIndexOutOfBoundsException: java.lang.ArrayIndexOutOfBoundsException at java.lang.System.arraycopy(Native Method) at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:1
java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:11107)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:244)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
代码如下:
// list with 2500 entries
for (CMInfo cm : list) {
if (cm != null) {
int i = 1;
stmt.setTimestamp(i++, cm.getDate());
stmt.setString(i++, cm.getId());
stmt.setString(i++, cm.getName());
stmt.setString(i++, cm.getCMap()); // +/- 3000 characteres
stmt.setString(i++, cm.getCMapIds()); // +/- 2000 characteres
stmt.setTimestamp(i++, cm.getLastUpdate());
stmt.setString(i++, cm.getInstance());
stmt.setString(i++, cm.getStatus());
stmt.setString(i++, cm.getProcessingID());
stmt.setInt(i++, cm.getCounter());
stmt.setInt(i++, cm.getPriority());
stmt.addBatch();
}
}
stmt.executeBatch();
connection.commit();
在仍然使用ojdbc7.jar驱动程序包的情况下,从Oracle11g切换到Oracle12c之后,我遇到了类似的异常。 更新驱动程序为我解决了问题。 我建议您尝试ojdbc8.jar驱动程序包,该驱动程序包位于:
不过,它确实需要Java 8。在仍然使用ojdbc7.jar驱动程序包的情况下,从Oracle 11g切换到Oracle 12c后,我遇到了类似的异常。 更新驱动程序为我解决了问题。 我建议您尝试ojdbc8.jar驱动程序包,该驱动程序包位于:
但它确实需要Java 8。“列出2500个条目”您确定吗?因为我相信我在调用
executeBatch()
而不先调用addBatch()
时看到过这样的错误。某些驱动程序在尝试执行空批处理时失败。第11107行的OraclePreparedStatement
在做什么?如果(this.batchRowsUpdatedArray!=null){assert(this.batchRowsUpdatedArray.length==this.currentRank);System.arraycopy(this.batchRowsUpdatedArray,0,localObject1,this.firstRowInBatch,this.currentRank);//第11107行}“包含2500个条目的列表”你确定吗?因为我相信我在调用executeBatch()
而不先调用addBatch()
时看到过这样的错误。某些驱动程序在尝试执行空批处理时失败。第11107行的OraclePreparedStatement
在做什么?如果(this.batchRowsUpdatedArray!=null){assert(this.batchRowsUpdatedArray.length==this.currentRank);System.arraycopy(this.batchRowsUpdatedArray,0,localObject1,this.firstRowInBatch,this.currentRank);//第11107行}