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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Oracle中,可以使用两种方法实现批量插入数据的效果。方法一是使用union all拼接查询方式,示例如下: ```sql insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE) select 8000,0,'Multi 8000',1 from dual union all select 8001,0,'Multi 8001',1 from dual ``` 方法二是使用insert all的方式,示例如下: ```sql MERGE INTO user u USING (SELECT ? id, ? name, ? age FROM dual) s ON (u.id = s.id) WHEN MATCHED THEN UPDATE SET u.name = s.name, u.age = s.age WHEN NOT MATCHED THEN INSERT (id, name, age) VALUES (s.id, s.name, s.age) ``` 在这个示例中,我们使用了JDBC的批处理机制来减少与数据库的交互次数。首先,我们通过getConnection()方法获取数据库连接,并将自动提交设置为false。然后,我们使用PreparedStatement来执行MERGE语句,并将需要插入的数据通过setXXX()方法设置到PreparedStatement中。接下来,我们使用addBatch()方法将每条数据添加到批处理中。最后,我们使用executeBatch()方法执行批处理,并通过commit()方法提交事务。如果在执行过程中发生异常,我们可以通过rollback()方法回滚事务。最后,我们通过closeConnection()方法关闭数据库连接。 请注意,以上示例中的代码是Java代码,用于演示如何使用JDBC实现批量插入数据。具体的SQL语句和代码实现可能需要根据实际情况进行调整。 #### 引用[.reference_title] - *1* [Oracle sql批量插入多条数据](https://blog.csdn.net/jiang1536/article/details/91993243)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [oracle批量插入数据](https://blog.csdn.net/weixin_40778583/article/details/130719158)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值