[英]JDBC PreparedStatement, Batch Update and generated Keys
我在批处理中使用 jdbc prepareStatement 并尝试获取由此创建的生成的密钥时遇到问题。
代码 :
PreparedStatement stmt = null;
...
connection.setAutoCommit(false);
stmt = connection.prepareStatement(insertSuspiciousElement,new String[] {"external_id","element_id"});
final int elementBatchSize = 5000;
int elementCount =0;
for(BlSuspiciousElement element : elements){
externalIds.add(element.getExternalId());
stmt.setInt(1, element.getBlElementType().getElementTypeId());
stmt.setString(2, element.getFirstname());
stmt.addBatch();
elementCount++;
if(elementCount % elementBatchSize == 0){
System.out.println("Running query with batch size for suspiciousElement");
stmt.executeBatch();
ResultSet keys = stmt.getGeneratedKeys();
while(keys.next()){
externalIdElementIdMapping.put(keys.getInt("external_id"),keys.getInt("element_id"));
}
keys.close();
stmt.clearBatch();
stmt.clearParameters();
stmt.clearWarnings();
System.out.println("Done query with batch size for suspiciousElement");
}
}
它在第一个 stmt.executeBatch() 方法失败。
错误 :
[30/01/12 15:54:41:684 CET] 00000029 RemoteExcepti E CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "processFullFeedForPepAndRelationUpdateOnly" on bean "BeanId(CoRelateEar#AmlKycToolBO.jar#FactivaDBUpdater, null)". Exception data: java.lang.ArrayIndexOutOfBoundsException
at oracle.jdbc.driver.T4CNumberAccessor.unmarshalOneRow(T4CNumberAccessor.java:201)
at oracle.jdbc.driver.T4C8Oall.readRXD(T4C8Oall.java:696)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:340)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044)
at oracle.jdbc.driver.OraclePreparedStatement.executeForRowsWithTimeout(OraclePreparedStatement.java:10143)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10249)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:230)
at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.executeBatch(WSJdbcStatement.java:748)
对我来说不是很明显...
似乎它不适用于批量更新? 仅用于语句或准备好的语句。 在这种情况下,我想我最好尝试进行批量插入,然后运行另一个查询以查找每个创建元素的生成键...
谢谢你的帮助,
F
我相信您应该告诉 Oracle JDBC 驱动程序您将检索生成的密钥。
查看以下问题的已接受答案以了解详细信息: PreparedStatement with Statement.RETURN_GENERATED_KEYS 。
2012 年 1 月 31 日编辑:如果这种方法不适用于批处理(我没有尝试过批处理),您可以不使用批处理,只需关闭自动提交,插入所有数据,然后提交。 在我的实验中,这种方法的性能损失仅为 3%。 我还在 SO 上找到了另一个类似的建议: MySQL batch stmt with Statement.RETURN_GENERATED_KEYS 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.