使用ojdbc14 10.2.0.4 进行批量写入数据到oracle时,写入的字段有140个,每1000条执行一次executeBatch,日志中出现大量异常ArrayIndexOutOfBoundsException信息,具体以下:
java.lang.ArrayIndexOutOfBoundsException: -32377
at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2673)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10689)
从日志信息来看,应该是oralce jdbc驱动内部setupBindBuffers方法中出现了数组越界异常。在网上找到一个帖子,通过他的思路得到了解决方案。
The 10g driver apparently keeps a global serialnumber for all parameters in the entire batch, with a "short"variable. So you can have at most 32768 parameters in the batch. I was havingthe same exception because I have a
INSERT statement with 42 parameters and mybatches can be as big as 1000 records, so 42000 > 32768 and this overflowsto a negative index. I reduced the batch factor to 100 to be safe, and all iswell. I guess your update DML should have a larger number of parameters
perrecord, right? (My diagnostic of the bug is just deduction from the symptoms)
INSERT statement with 42 parameters and mybatches can be as big as 1000 records, so 42000 > 32768 and this overflowsto a negative index. I reduced the batch factor to 100 to be safe, and all iswell. I guess your update DML should have a larger number of parameters
perrecord, right? (My diagnostic of the bug is just deduction from the symptoms)
地址:https://community.oracle.com/thread/599441?start=15&tstart=0
按照这个思路,将addBatch的数量减少到100,使每次executeBatch的参数值小于32768,发现异常解决。
来源:oschina
链接:https://my.oschina.net/u/4396169/blog/3596557