2012-01-30 17 views
5

मुझे बैच में जेडीबीसी तैयार स्टेटमेंट का उपयोग करने और इस से बनाई गई जेनरेट की गई कुंजी प्राप्त करने का प्रयास करने में समस्या है।जेडीबीसी प्रीपेडस्टेटमेंट, बैच अपडेट और जेनरेट की गई कुंजी

कोड:

 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) 
नहीं

मेरे लिए बहुत स्पष्ट ...

ऐसा लगता है कि यह बैच अद्यतन के लिए काम नहीं करता है? केवल कथन या तैयार कथन के लिए। इस मामले में, मुझे लगता है कि मैं बेहतर मेरे बैच डालने करने की कोशिश करना चाहते हैं, और उसके बाद प्रत्येक बनाया तत्व के लिए उत्पन्न कुंजियों को खोजने के लिए एक और क्वेरी चलाने ...

आपकी मदद के लिए धन्यवाद,

एफ

उत्तर

0

मुझे विश्वास है कि आपको ओरेकल जेडीबीसी ड्राइवर को बताना चाहिए कि आप जेनरेट की गई कुंजी पुनर्प्राप्त कर रहे हैं।

विवरण के लिए निम्नलिखित प्रश्न के स्वीकृत उत्तर देखें: PreparedStatement with Statement.RETURN_GENERATED_KEYS

संपादित करें 1/31/12: यदि यह दृष्टिकोण बैच के साथ काम नहीं करता है (और मैंने इसे बैच के साथ नहीं किया है), तो आप बैचिंग के बजाय, केवल ऑटोकॉमिट बंद कर सकते हैं, अपने सभी डेटा के लिए आवेषण कर सकते हैं, और फिर प्रतिबद्ध करें। मेरे प्रयोगों में इस दृष्टिकोण के लिए प्रदर्शन जुर्माना केवल 3% था। मुझे SO: MySQL batch stmt with Statement.RETURN_GENERATED_KEYS पर एक और समान अनुशंसा मिली है।

+0

यह लिंक केवल एक तैयार शर्त का उपयोग करने के बारे में है। मेरा मुद्दा यह है कि जब मैं बैच में निष्पादित एक तैयार स्टेटमेंट में जेनरेट की गई कुंजी पुनर्प्राप्त करने का प्रयास कर रहा हूं ... थोड़ा अलग। – Farid

+0

@ फ़ारिड: क्या आपने कथन तैयार करते समय RETURN_GENERATED_KEYS निर्दिष्ट करने का प्रयास किया था? कुछ ऐसा: stmt = connection.prepareStatement (sql, STATEment.RETURN_GENERATED_KEYS); – Olaf

+0

हाँ, एक ही त्रुटि। – Farid