2012-02-08 14 views
9

मैं निम्नलिखित कोड का टुकड़ा है:जावा प्रीपेडस्टेटमेन के साथ SQL कमांड के बैच को निष्पादित करने के बाद पैरामीटर मान स्वचालित रूप से साफ़ किए गए हैं?

PreparedStatement preparedStatement = connection.prepareStatement(sql); 
for (int i = 0; i < 100000; i++) { 
    preparedStatement.setObject(1, someValue); 
    preparedStatement.addBatch(); 
    if ((i + 1) % 100 == 0) { 
     preparedStatement.executeBatch(); 
    } 
} 

तो मैं विभिन्न मूल्यों के साथ एक आदेश के आसपास 100 000 बार निष्पादित करने के लिए चाहते हैं। मेरा सवाल है: क्या प्रत्येक कॉल को निष्पादित करने के लिए तैयार किए गए प्रीपेडस्टेटमेंट के पैरामीटर बैच() हैं या क्या मुझे निष्पादन बैच() को कॉल करने के बाद तैयार स्टेटमेंट.क्लर पैरामीटर() को स्पष्ट रूप से कॉल करना होगा ताकि यह सुनिश्चित किया जा सके कि केवल अंतिम 100 कमांड निष्पादित किए जाएंगे ?

उत्तर

3

मैं यहाँ देख सकते हैं: http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/jdbc/odbc/JdbcOdbcStatement.java.html

executeBatch() अंत में clearBatch() कहता है।

लेकिन इसके लिए कोई गारंटी नहीं है कि अन्य कार्यान्वयन में यह वही होगा।

+1

* "लेकिन इसके लिए कोई गारंटी नहीं है कि यह अन्य कार्यान्वयन में बिल्कुल वही होगा।" * ठीक है, तो यह वास्तव में उपयोगी नहीं है। –

5

मैं कहूंगा कि अधिक प्रासंगिक सवाल यह था कि बैच साफ़ हो गया है। हालांकि यह एक उचित धारणा की तरह लगता है, प्रलेखन को छोड़कर स्पष्ट कह रही है कि यह मंजूरी दे दी है (और मैं executeBatch पर कुछ भी नहीं देख कि कह है), मैं सिद्धांत पर स्पष्ट रूप से clearBatch का उपयोग करेंगे कि एक कार्यान्वयन करता है, तो स्पष्ट बैच, clearBatch एक त्वरित नो-ओप होगा; और अगर ऐसा नहीं होता है, तो मुझे इसे करने की ज़रूरत है।

+0

नीचे दिए गए स्पेक खंड के बारे में आप क्या सोचते हैं? क्या आपको लगता है कि ड्राइवर डेवलपर के लिए पर्याप्त बाध्यकारी (या पर्याप्त स्पष्ट) है? –

0

मैं कहूंगा कि यह स्पष्ट रूप से इसे साफ़ करना बेहतर है। कुछ जेडीबीसी ड्राइवर executeBatch() के बाद आंतरिक बफर साफ़ नहीं करते हैं।
clearBatch() पर एक स्पष्ट कॉल IndexOutOfBoundException जैसी त्रुटियों से बचने के लिए आवश्यक है क्योंकि कुछ लॉजिकल त्रुटियां भी पेश की जा सकती हैं।

धन्यवाद!

6

हाँ।

विधि executeBatch बुला वक्तव्य वस्तु की वर्तमान परिणाम सेट करता है, तो एक खुला है बंद कर देता है कॉलिंग: JDBC 3.0 की धारा 15.1.2 और खंड JDBC 4.1 की 14.1.2 के अनुसार। कथन का बैच निष्पादित करने के बाद पर रीसेट कर दिया गया है बैच देता है।

यह दुर्भाग्यपूर्ण है कि इस तरह का एक महत्वपूर्ण विवरण लगभग एक अच्छा प्रिंट के रूप में समाप्त हुआ।

पहले से उल्लिखित उदाहरण के अलावा, jtds ड्राइवर executeBatch() के अंत में ब्लॉक को साफ़बैच() भी करता है।