Tôi có một vấn đề sử dụng PreparedStatement jdbc trong hàng loạt và cố gắng để có được các phím tạo được tạo ra từ này.JDBC PreparedStatement, hàng loạt Cập nhật và tạo phím
Mã:
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");
}
}
nó không thành công ở phương pháp stmt.executeBatch đầu tiên().
Lỗi:
[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)
Không phải rất rõ ràng đối với tôi ...
Dường như nó không hoạt động để cập nhật hàng loạt? Chỉ cho tuyên bố hoặc tuyên bố chuẩn bị. Trong trường hợp này, tôi nghĩ Tốt hơn tôi nên cố gắng làm chèn lô của tôi, và sau đó chạy một truy vấn để tìm ra chìa khóa tạo ra cho mỗi yếu tố tạo ra ...
Nhờ sự giúp đỡ của bạn,
F
Liên kết này là về việc sử dụng duy nhất một PreparedStatement. Vấn đề của tôi là khi tôi đang cố truy xuất các khóa đã tạo trong một tệp chuẩn bị được thực hiện theo lô ... Hơi khác một chút. – Farid
@Farid: Bạn đã thử chỉ định RETURN_GENERATED_KEYS khi chuẩn bị tuyên bố? Một cái gì đó như: stmt = connection.prepareStatement (sql, Statement.RETURN_GENERATED_KEYS); – Olaf
Đúng, cùng một lỗi. – Farid