1 问题
使用PreparedStatement向 Oracle 10g数据库批量插入数据时,当插入2万条数据后,出现异常java.lang.ArrayIndexOutOfBoundsException,具体信息如下:
java.lang.ArrayIndexOutOfBoundsException: -32413
at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2672)
atoracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10688)
2 原因
一开始以为生成数据的方法里面有数组index越界了,检查并测试了带有数组的方法后,都没有问题。然后仔细看了报错信息,发现OraclePreparedStatement.setupBindBuffers ,说明 statement 设置BindBuffers 时index越界,而 statement 只有为SQL绑定参数这个操作,那应该就是参数这块的问题了。
查找资料了解到 Oracle 10g 版本对 statement 的参数有个限制:
“Oracle 10g驱动程序Driver为整个批处理中的所有参数维护了一个全局序列数字(a global serial number),一个 short 类型变量,short 类型的参数范围为(-32768~32767)所以批处理中最多可以有32768个参数。”
此段内容参考 Oracle 社区讨论https://community.oracle.com/thread/599441?start=15&tstart=0 。
然后查看了报错的那张表的表结构,发现有73个字段,还有的需插入数据的表字段个数更多,有130多个,程序中设置的批量大小为1000(batchSize = 1000),所以出现 ArrayIndexOutOfBoundsException 问题。
3 解决方法
在程序中对字段个数进行判断,字段个数大于32的,则将批量大小设置为100,问题解决。
参考:
https://community.oracle.com/thread/599441?start=15&tstart=0