2012-03-18 15 views
5

मैं एक SQLite जावा पुस्तकालय साइट से निम्न उदाहरण की नकल की:स्पष्टीकरण ऑटो प्रतिबद्ध

PreparedStatement prep = conn.prepareStatement("insert into people values (?, ?);"); 
    prep.setString(1, "Gandhi"); 
    prep.setString(2, "politics"); 
    prep.addBatch(); 
    prep.setString(1, "Turing"); 
    prep.setString(2, "computers"); 
    prep.addBatch(); 
    conn.setAutoCommit(false); 
    prep.executeBatch(); 
    conn.setAutoCommit(true); 

मैं autoCommit()executeBatch() के दोनों ओर टॉगल के महत्व को समझने के लिए संघर्ष कर रहा हूँ। क्या यह केवल प्रत्येक व्यक्तिगत बैच ऑपरेशन के लिए प्रतिबद्धता को रोकता है? इस प्रकार setAutoCommit(true) द्वारा एक 'थोक' प्रतिबद्धता बनाई जाएगी।

धन्यवाद।

+0

मैंने इसका उत्तर जोड़ा है जो स्वीकृत उत्तर में कुछ जानकारी के विपरीत है। FYI करें। – Gray

उत्तर

8

ऑटो प्रतिबद्धता बैच से पहले अक्षम कर दी गई है क्योंकि ऑटो प्रतिबद्धता सक्षम करने के लिए प्रतिबद्ध होगा (यानी सिंक होने के लिए प्रतीक्षा करें जिसका अर्थ यह है कि डेटा को वास्तव में हार्ड डिस्क जैसे लगातार भंडारण के लिए लिखा जाता है) डालने वाली प्रत्येक पंक्ति के बाद।

यदि ऑटो प्रतिबद्धता गलत है, तो यह सिंक की प्रतीक्षा नहीं करेगा।

सिंक की प्रतीक्षा में अंतर और इंतजार नहीं करना यह गारंटी है कि डेटा वास्तव में हार्ड डिस्क पर है या यह बफर में है (जिसे आईओ या हार्ड डिस्क का बफर किया जा सकता है)।

संक्षेप में, ऑटो प्रतिबद्धता को अक्षम करने से आपको प्रदर्शन बढ़ावा मिलता है। और मुझे लगता है कि डिफ़ॉल्ट ऑटो प्रतिबद्धता सक्षम है।

अनुकूलन

आप ऑटो करना चाहते हैं पर प्रतिबद्ध है और अभी भी प्रदर्शन को बढ़ावा देने की जरूरत है सिर्फ बैच ऑपरेशन से पहले लेनदेन के रूप में शुरू करने और बाद लेन-देन के लिए प्रतिबद्ध करने की कोशिश का एक और तरीका। इस तरह से प्रत्येक डालने के बाद sqlite ऑटो प्रतिबद्ध नहीं होगा और यह अच्छा प्रदर्शन बढ़ावा देगा।

संपादित करें:

जब आप एक सौदे आप केवल ऑटो अक्षम कर रहे हैं शुरू करने के लिए कि लेनदेन के लिए प्रतिबद्ध और इसे फिर से 'ऑन' हो जाएगा एक बार लेन-देन से अधिक है। क्या ऑटो प्रतिबद्धता मदद करता है जब आप अलग-अलग पंक्तियों को जोड़/अपडेट कर रहे हैं (बैच के रूप में नहीं), तो आपको प्रत्येक डालने/अपडेट के लिए लेनदेन को स्पष्ट रूप से प्रारंभ करने की आवश्यकता नहीं है। और तथ्य के बाद, ऑटो-प्रतिबद्ध को सही करने के संबंध में, प्रतिबद्धता के लिए कॉल नहीं करता है। यदि आप ऑटो-प्रतिबद्ध सत्य बनाते हैं और जो कुछ भी आपने पहले ही डाला/अपडेट किया है, उसके पास कोई प्रभाव नहीं होगा और इसमें गारंटी नहीं होगी जो उन प्रविष्टियों/अपडेट करने से पहले ऑटो-प्रतिबद्ध सत्य के रूप में होती है।

Here's some information about speeding up Sqlite INSERTs.

+0

विस्तृत उत्तर के लिए धन्यवाद। आप सही हैं, 'autoCommit() 'डिफ़ॉल्ट रूप से सक्षम है। जब 'autoCommit (true)' कहा जाता है, तो क्या आप जानते हैं कि बैच डेटा लगातार स्टोरेज पर लिखा जाएगा या नहीं? – c24w

+0

हाँ यह लिखा जाएगा। ऑटो प्रतिबद्धता के साथ यह वही गारंटी नहीं होगी। मैंने आपको एक और विकल्प देने के लिए अपना उत्तर अपडेट किया था। – havexz

3

@havexz जवाब कुछ गलत जानकारी तो मैं सोचा था मैं भावी पीढ़ी के लिए एक जवाब जोड़ना होगा देता है।

  1. एफवाईआई, SQLite सीधे ऑटो-प्रतिबद्धता का समर्थन नहीं करता है। एक SQLite जेडीबीसी कनेक्शन पर setAutoCommit(false) पर कॉलिंग वास्तव में जेरियल और ज़ेंटस ड्राइवरों के साथ एक लेनदेन शुरू करता है। इस तो सवाल यह देखें: सच इच्छा नहीं को How to disable autocommit in sqlite4java?

  2. मैं लगभग सकारात्मक है कि स्थापित करने के लिए वापस ऑटो प्रतिबद्ध हूँ एक डेटाबेस कनेक्शन पर प्रतिबद्ध है। अगला बयान जो खत्म होता है, वह किसी भी बकाया परिवर्तन को जारी रखेगा लेकिन आपको बैच ऑपरेशंस को वास्तव में प्रतिबद्ध करने के लिए conn.commit(); करना होगा।

  3. मूल रूप से एक लेनदेन शुरू करना ऑटो-प्रतिबद्धता को बंद करने जैसा ही है, इसलिए यह इंगित करना अनुचित है कि आप लेनदेन के अंदर ऑटो-प्रतिबद्ध छोड़ सकते हैं।

+0

आपके इनपुट श्री ग्रे के लिए धन्यवाद! मैं अभी भी उलझन में हूं क्यों कोड [यहां] (http://www.zentus.com/sqlitejdbc/) मेरे मूल पोस्ट के अनुसार 'setAutoCommit (...)' का उपयोग करने का सुझाव देगा। साथ ही, कैसे conn.exec ("COMMIT") 'और' conn.commit() 'तुलना करेगा? क्या उत्तरार्द्ध अनिवार्य रूप से पूर्व को 'लपेटता है'? धन्यवाद! – c24w

+1

शायद ज़ेंटस ड्राइवर कवर के तहत लेनदेन कर रहा है। बीटीडब्ल्यू, जेरियल स्क्लाइट ड्राइवर ज़ेंटस से काफी बेहतर है। http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC – Gray

+0

आरई: 'conn.exec (" COMMIT ") ', दाएं, duh, मैंने इसे' conn.commit()' में बदल दिया है। – Gray

संबंधित मुद्दे