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) ;
}
在使用Oracle进行批量插入操作时,尝试利用Statement.RETURN_GENERATED_KEYS获取生成的ID,却遇到了ArrayIndexOutOfBoundsException异常。本文探讨了这一问题,并提供了一种解决方案:对于Oracle,不使用RETURN_GENERATED_KEYS参数。
7148

被折叠的 条评论
为什么被折叠?



