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) ;
}