2011-11-03 15 views
8

मैं 2 अलग धागे से एक SQLite डेटाबेस का उपयोग करने के लिए है, जिससे डेटाबेस के लिए 2 अलग कनेक्शन का उपयोग करना चाहते हैं। दोनों धागे मुख्य रूप से डीबी से पढ़ेंगे और कभी-कभी डीबी को भी लिखेंगे। अगर मुझे लगता है कि एक ही समय में डीबी को लिखने वाले दोनों धागे के खिलाफ बाधाएं हैं, तो क्या मुझे सुरक्षित महसूस करना चाहिए कि मुझे इस परिदृश्य में कोई समस्या नहीं होनी चाहिए?SQLite कनेक्शन और लॉक करना

उत्तर

6

SQLite threadsafe है और, हाल के संस्करण के साथ, आप धागे के बीच एक भी कनेक्शन साझा कर सकते हैं। उस ने कहा, एसक्यूएलएट अकसर किये गए सवाल बताते हैं कि "थ्रेड्स एविल" (मुझे नहीं लगता कि उनका मतलब SQLite के संदर्भ में है, लेकिन एक सामान्य कथन के रूप में)।

एसक्यूलाइट में लॉकिंग तंत्र हैं ताकि एक दूसरा उदाहरण डाटाबेस पर एक लिखित लॉक प्राप्त करने का प्रयास करता है, फिर भी मौजूदा ताले समाप्त होने तक कतारबद्ध किया जाएगा, भले ही दोनों धागे एसक्यूएलसाइट लिख रहे हों, आपको समायोजित करना चाहिए। पूछे जाने वाले प्रश्न चलता है कि यह आम तौर पर नेटवर्क फाइल सिस्टम की वजह से खराब फाइल सिस्टम में ताला लगा कार्यान्वित करने के लिए पर विभिन्न प्रक्रियाओं से कई कनेक्शन का उपयोग करने के लिए सुरक्षित नहीं है, लेकिन मुझे नहीं लगता कि चेतावनी अपने उपयोग के लिए लागू होता है।

+0

धन्यवाद ... एफएक्यू एक अच्छा संसाधन था –

+0

लेकिन मुझे लगता है कि एक कनेक्शन के साथ @DrakeAmara मामले में डेटाबेस के साथ कोई समवर्ती अनुरोध नहीं होगा यदि वह महान होगा अलग कनेक्शन हैं क्योंकि इसका मतलब समवर्ती पहुंच होगी डेटाबेस – user1530779

0

SQLite स्पष्ट रूप से सुरक्षित थ्रेड नहीं है, इसलिए आप डेटा भ्रष्टाचार उम्मीद कर सकते हैं यदि आप ऐसा करते है।

उपयोग म्युटेक्स सुनिश्चित करें कि दोनों धागे एक ही समय में डेटाबेस का उपयोग नहीं कर सकते हैं, या घंटे खर्च प्रेत डेटा भ्रष्टाचार कीड़े है कि केवल शायद ही कभी होता नीचे ट्रैक करने के लिए कोशिश कर रहा है और एक कठिन में फैशन पुन: पेश करने करने के लिए ताला लगा।

http://sqlite.org/faq.html#q5

+4

प्रलेखन से (http://www.sqlite.org/faq.html# q6): ** SQLite थ्रेडसेफ है। ** –

9

बिल्कुल सही नहीं है। कृपया मेरे लंबे जबाब यहाँ देखें:

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

+0

ये लिंक अब मर चुके हैं, क्या आप वर्तमान पोस्ट कर सकते हैं, मैं वास्तव में इन्हें पढ़ने में रूचि रखूंगा। धन्यवाद! – Matthias

+1

आप सही हैं। चारों ओर खोदने और देखने की आवश्यकता होगी कि मेरे पास क्या है। यदि वे मौजूद हैं, तो वे http://touchlabblog.tumblr.com –

+0

के अंतर्गत होंगे, धन्यवाद, धन्यवाद! – Matthias

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