2012-01-30 39 views
5

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

Trả lời

0

tôi tin rằng bạn nên nói với tài xế Oracle JDBC mà bạn muốn được lấy chìa khóa tạo ra.

Kiểm tra ra câu trả lời chấp nhận những câu dưới đây để biết chi tiết: PreparedStatement with Statement.RETURN_GENERATED_KEYS.

EDIT 1/31/12: Nếu phương pháp này không hoạt động với hàng loạt (và tôi không thử hàng loạt), bạn có thể thay vì ghép, chỉ cần tắt tự động, thực hiện chèn cho tất cả dữ liệu của bạn, và sau đó cam kết. Trong thí nghiệm của tôi, hiệu suất phạt cho phương pháp này chỉ là 3%. Tôi cũng đã tìm thấy một đề xuất tương tự khác về SO: MySQL batch stmt with Statement.RETURN_GENERATED_KEYS.

+0

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

+0

@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

+0

Đúng, cùng một lỗi. – Farid

Các vấn đề liên quan