Oracle批量插入时出ArrayIndexOutOfBoundsException

Mysql在批量插入时,无法获得生成的id值,为了解决这个问题,给prepareStatement加了Statement.RETURN_GENERATED_KEYS参数。

conn.prepareStatement(rawSQL, Statement.RETURN_GENERATED_KEYS) 

但是Oracle批量插入时,出现ArrayIndexOutOfBoundsException:

java.lang.ArrayIndexOutOfBoundsException
	at java.lang.System.arraycopy(Native Method)
	at oracle.jdbc.driver.T4CRowidAccessor.unmarshalOneRow(T4CRowidAccessor.java:203)
	at oracle.jdbc.driver.T4C8Oall.readRXD(T4C8Oall.java:774)
	at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:403)
	at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
	at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:208)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1046)
	at oracle.jdbc.driver.OraclePreparedStatement.executeForRowsWithTimeout(OraclePreparedStatement.java:10298)
	at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10404)
	at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:230)
	at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
	at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
	at org.guzz.jdbc.ObjectBatcherImpl.executeBatch(ObjectBatcherImpl.java:310)
	at com.nebula.commons.orm.guzz.GuzzDao.batchInsert(GuzzDao.java:1590)
	at com.nebula.commons.service.impl.Manager.batchInsert(Manager.java:252)

看来Oracle使用Statement.RETURN_GENERATED_KEYS是有问题的。解决办法就是Oracle不用Statement.RETURN_GENERATED_KEYS。

if (conn.getMetaData().getDriverName().contains("MySQL")) {
    this.ps = conn.prepareStatement(rawSQL, Statement.RETURN_GENERATED_KEYS) ;
} else {
    this.ps = conn.prepareStatement(rawSQL) ;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值