话说几个月前,就发现了这个异常,第一行提示java.lang.ArrayIndexOutOfBoundsException: -32593
越界,还是负数的,就继续找根源,找到项目中的批量插入,缺发现找不到越界的原因,代码是这种形式的
executor.startBatch();
for (int i = 0, count = locallist.size(); i < count; i++) {
...
}
executor.executeBatch();
看不出越界。
昨天又出现了,决定要解决这个问题,错误如下:
java.lang.ArrayIndexOutOfBoundsException: -32593
at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2677)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9270)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:210)
at com.alibaba.druid.filter.FilterChainImpl.statement_executeBatch(FilterChainImpl.java:2594)
at com.alibaba.druid.filter.FilterAdapter.statement_executeBatch(FilterAdapter.java:2457)
at com.alibaba.druid.filter.FilterEventAdapter.statement_executeBatch(FilterEventAdapter.java:279)
at com.alibaba.druid.filter.FilterChainImpl.statement_executeBatch(FilterChainImpl.java:2592)
at com.alibaba.druid.proxy.jdbc.StatementProxyImpl.executeBatch(StatementProxyImpl.java:192)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeBatch(DruidPooledPreparedStatement.java:542)
at com.ibatis.sqlmap.engine.execution.SqlExecutor$Batch.executeBatch(SqlExecutor.java:611)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeBatch(SqlExecutor.java:118)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.executeBatch(SqlMapExecutorDelegate.java:759)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.executeBatch(SqlMapSessionImpl.java:184)
...
at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:200)
...
找了一些无用的答案,最后锁定第一行OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2677)查找
http://www-01.ibm.com/support/docview.wss?uid=swg21432290
这个链接是说引起这个异常的原因:
oracle 10g的驱动执行的批量提交只支持32768个参数,如果表的字段多于32个,有可能引发该异常,解决办法是升级oracle的驱动。
项目用的是ojdbc14.jar,算了一下,一次提交3000条记录,插入10多个字段,超过32768,之后的插入一直失败。应该就是这个问题了。
之后查找了一下http://tiantian0521.blog.163.com/blog/static/4172088320117294265766/
这个链接说的是几个ojdbc的区别,在最后一段也表示遇到批量插入问题,换了ojdbc6.jar后解决了。