मैं 2 अलग धागे से एक SQLite डेटाबेस का उपयोग करने के लिए है, जिससे डेटाबेस के लिए 2 अलग कनेक्शन का उपयोग करना चाहते हैं। दोनों धागे मुख्य रूप से डीबी से पढ़ेंगे और कभी-कभी डीबी को भी लिखेंगे। अगर मुझे लगता है कि एक ही समय में डीबी को लिखने वाले दोनों धागे के खिलाफ बाधाएं हैं, तो क्या मुझे सुरक्षित महसूस करना चाहिए कि मुझे इस परिदृश्य में कोई समस्या नहीं होनी चाहिए?SQLite कनेक्शन और लॉक करना
उत्तर
SQLite threadsafe है और, हाल के संस्करण के साथ, आप धागे के बीच एक भी कनेक्शन साझा कर सकते हैं। उस ने कहा, एसक्यूएलएट अकसर किये गए सवाल बताते हैं कि "थ्रेड्स एविल" (मुझे नहीं लगता कि उनका मतलब SQLite के संदर्भ में है, लेकिन एक सामान्य कथन के रूप में)।
एसक्यूलाइट में लॉकिंग तंत्र हैं ताकि एक दूसरा उदाहरण डाटाबेस पर एक लिखित लॉक प्राप्त करने का प्रयास करता है, फिर भी मौजूदा ताले समाप्त होने तक कतारबद्ध किया जाएगा, भले ही दोनों धागे एसक्यूएलसाइट लिख रहे हों, आपको समायोजित करना चाहिए। पूछे जाने वाले प्रश्न चलता है कि यह आम तौर पर नेटवर्क फाइल सिस्टम की वजह से खराब फाइल सिस्टम में ताला लगा कार्यान्वित करने के लिए पर विभिन्न प्रक्रियाओं से कई कनेक्शन का उपयोग करने के लिए सुरक्षित नहीं है, लेकिन मुझे नहीं लगता कि चेतावनी अपने उपयोग के लिए लागू होता है।
SQLite स्पष्ट रूप से सुरक्षित थ्रेड नहीं है, इसलिए आप डेटा भ्रष्टाचार उम्मीद कर सकते हैं यदि आप ऐसा करते है।
उपयोग म्युटेक्स सुनिश्चित करें कि दोनों धागे एक ही समय में डेटाबेस का उपयोग नहीं कर सकते हैं, या घंटे खर्च प्रेत डेटा भ्रष्टाचार कीड़े है कि केवल शायद ही कभी होता नीचे ट्रैक करने के लिए कोशिश कर रहा है और एक कठिन में फैशन पुन: पेश करने करने के लिए ताला लगा।
प्रलेखन से (http://www.sqlite.org/faq.html# q6): ** SQLite थ्रेडसेफ है। ** –
बिल्कुल सही नहीं है। कृपया मेरे लंबे जबाब यहाँ देखें:
What are the best practices for SQLite on Android?
आप भ्रष्ट नहीं अपने डेटाबेस है, लेकिन अगर दो अलग धागे, दो अलग अलग कनेक्शन के साथ, एक ही समय में डाटाबेस को लिखने की कोशिश, तो आप समस्याओं होगा होगा । एक "हार" होगा। वे क्रम में चलाने के लिए इंतजार नहीं करेंगे। यदि आप 'insertOrThrow' के बजाय 'डालने' कहते हैं, तो आपको अपवाद भी नहीं मिलेगा। आप बस डीबी को नहीं लिखेंगे।
यहाँ कैसे SQLite, एंड्रॉयड में, काम करता है। प्रत्येक SqliteOpenHelper उदाहरण डेटाबेस के लिए 1 कनेक्शन है। इससे कोई फर्क नहीं पड़ता कि आप कितनी बार 'getRead/WriteableDatabase' कहते हैं। एक सहायक, एक कनेक्शन। साथ ही, एंड्रॉइड स्क्लाइट कनेक्शन कोड अपने थ्रेड लॉकिंग को लागू करता है, इसलिए यदि आप एक ही स्क्लाइट ओपनहेल्पर का उपयोग करते हैं, और विस्तार से, वही कनेक्शन, तो आप ठीक होंगे।
अगर, हालांकि, आप एक से अधिक सहायक का उपयोग करें, यदि आप एक बुरा तरह से हो सकता है।
मुझे लगता है आप पढ़ एक से अधिक थ्रेड हो सकता था, और 1 लेखन, और बाहर आने के ठीक है, लेकिन मैं इस परीक्षण नहीं किया।
क्या आप लेखन प्रदर्शन के लिए एकाधिक धागे का उपयोग कर रहे हैं? यदि ऐसा है, तो मैं बस "लेनदेन" के उपयोग को अनुकूलित करने का सुझाव दूंगा। यदि आप कई स्वतंत्र लिखते हैं, तो यह बहुत धीमा है। यदि आप उन्हें बैच में लपेटते हैं, तो यह बहुत तेज़ (अपेक्षाकृत) है। मुझे संदेह है क्योंकि यह प्रत्येक स्वतंत्र लेखन के साथ, एंड्रॉइड डिस्क पर फिसल जाता है (जो बहुत धीमा है)। यदि आप उन्हें एक गुच्छा में करते हैं, तो बदलाव सभी 1 लिखने में किए जाते हैं।
1 सहायक उदाहरण बनाए रखने के लिए के रूप में, इसके बारे में यहाँ मेरा एक हाल ही में ब्लॉग पोस्ट है:
http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection
मैं OrmLite एंड्रॉयड बंदरगाह की मेरी जल्दी कार्यान्वयन के हिस्से के रूप में कुछ काफी जटिल संदर्भ गिनती तर्क लिखा था, लेकिन मुझे नहीं लगता कि इस बिंदु पर यह सब आवश्यक है।
http://touchlabblog.tumblr.com/post/24474455802/ormlite-for-android
लिंक में पूर्णता के लिए, SQLite लॉकिंग और कई कनेक्शन के बारे में अपने ब्लॉग पोस्ट:
http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking
ये लिंक अब मर चुके हैं, क्या आप वर्तमान पोस्ट कर सकते हैं, मैं वास्तव में इन्हें पढ़ने में रूचि रखूंगा। धन्यवाद! – Matthias
आप सही हैं। चारों ओर खोदने और देखने की आवश्यकता होगी कि मेरे पास क्या है। यदि वे मौजूद हैं, तो वे http://touchlabblog.tumblr.com –
के अंतर्गत होंगे, धन्यवाद, धन्यवाद! – Matthias
- 1. कभी भी एंड्रॉइड SQLite कनेक्शन
- 2. ADO.NET, SQLite और TSQL
- 3. दो वैक्टरों को लॉक करना और उन्हें
- 4. एनएसएलॉक - लॉक लॉक लॉक करते समय बस ब्लॉक करना चाहिए?
- 5. SQLite:
- 6. SQLite
- 7. एनएफएस फाइल सिस्टम पर स्क्लाइट फ़ाइल लॉक करना संभव है?
- 8. SQLite डेटाबेस फ़ाइल को पढ़ने पर लॉक करता है?
- 9. System.IO.File.Create फ़ाइल को लॉक करना
- 10. SQLite
- 11. सी # में SQLite का उपयोग करना Pragma-s
- 12. SQLite - निकटतम मूल्य प्राप्त करना
- 13. SQLite, iPhone और संस्करण
- 14. memcached क्लाइंट: कनेक्शन खोलना, बंद करना और पुन: उपयोग करना
- 15. एक एंड्रॉयड फोन (लॉक पैटर्न या समान) को लॉक करना
- 16. डाटाबेस लॉक किए बिना डेटा रीडर के साथ SQLite क्वेरी कैसे करें?
- 17. HttpsURL कनेक्शन और इंटरमीटेंट कनेक्शन
- 18. कनेक्शन टाइमआउट और कनेक्शन लाइफटाइम
- 19. SQLite डीबी और ContentProvider
- 20. SQLite और विफल
- 21. SQLite फ़ाइल लॉकिंग और ड्रॉपबॉक्स
- 22. रीडरवाइटर लॉक बनाम लॉक {}
- 23. FluentNhibernate और SQLite
- 24. एंड्रॉइड और SQLite
- 25. SQLite और SQL
- 26. SQLite और CoreData
- 27. SQLite डेटाबेस और कर्सर
- 28. जावा और SQLite
- 29. जेएसओएन को पार्स करना और उन्हें SQLite डेटाबेस
- 30. यूआईयूटोमेशन और रिमोट डेस्कटॉप कनेक्शन
धन्यवाद ... एफएक्यू एक अच्छा संसाधन था –
लेकिन मुझे लगता है कि एक कनेक्शन के साथ @DrakeAmara मामले में डेटाबेस के साथ कोई समवर्ती अनुरोध नहीं होगा यदि वह महान होगा अलग कनेक्शन हैं क्योंकि इसका मतलब समवर्ती पहुंच होगी डेटाबेस – user1530779