मुझे बैच में जेडीबीसी तैयार स्टेटमेंट का उपयोग करने और इस से बनाई गई जेनरेट की गई कुंजी प्राप्त करने का प्रयास करने में समस्या है।जेडीबीसी प्रीपेडस्टेटमेंट, बैच अपडेट और जेनरेट की गई कुंजी
कोड:
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)
नहीं
मेरे लिए बहुत स्पष्ट ...
ऐसा लगता है कि यह बैच अद्यतन के लिए काम नहीं करता है? केवल कथन या तैयार कथन के लिए। इस मामले में, मुझे लगता है कि मैं बेहतर मेरे बैच डालने करने की कोशिश करना चाहते हैं, और उसके बाद प्रत्येक बनाया तत्व के लिए उत्पन्न कुंजियों को खोजने के लिए एक और क्वेरी चलाने ...
आपकी मदद के लिए धन्यवाद,
एफ
यह लिंक केवल एक तैयार शर्त का उपयोग करने के बारे में है। मेरा मुद्दा यह है कि जब मैं बैच में निष्पादित एक तैयार स्टेटमेंट में जेनरेट की गई कुंजी पुनर्प्राप्त करने का प्रयास कर रहा हूं ... थोड़ा अलग। – Farid
@ फ़ारिड: क्या आपने कथन तैयार करते समय RETURN_GENERATED_KEYS निर्दिष्ट करने का प्रयास किया था? कुछ ऐसा: stmt = connection.prepareStatement (sql, STATEment.RETURN_GENERATED_KEYS); – Olaf
हाँ, एक ही त्रुटि। – Farid