Oracle批量插入数据报executeBatch异常:ArrayIndexOutOfBoundsException

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值