क्या मैं एक SQLite डेटाबेस को कई कनेक्शनों से समवर्ती रूप से पढ़ और लिख सकता हूं?


89

मेरे पास एक SQLite डेटाबेस है जो दो प्रक्रियाओं द्वारा उपयोग किया जाता है। मैं सोच रहा हूँ, SQLite के सबसे हाल के संस्करण के साथ, जबकि एक प्रक्रिया (कनेक्शन) डेटाबेस को लिखने के लिए एक लेनदेन शुरू करती है, क्या दूसरी प्रक्रिया डेटाबेस से एक साथ पढ़ने में सक्षम होगी?


संबंधित प्रश्न यहां देखें .. stackoverflow.com/questions/12117016/…
AndroidGeek

जवाबों:


146

मैंने विभिन्न स्रोतों से जानकारी एकत्र की, ज्यादातर sqlite.org से, और उन्हें एक साथ रखा:

सबसे पहले, डिफ़ॉल्ट रूप से, कई प्रक्रियाओं में एक ही समय में एक ही SQLite डेटाबेस खुला हो सकता है, और कई रीड एक्सेस समानांतर में संतुष्ट हो सकते हैं।

लिखने के मामले में, डेटाबेस के लिए एक एकल लेखन डेटाबेस को थोड़े समय के लिए बंद कर देता है, कुछ भी नहीं, यहां तक ​​कि पढ़ना, डेटाबेस फ़ाइल को बिल्कुल भी एक्सेस कर सकता है।

संस्करण 3.7.0 से शुरू होकर, एक नया "राइट अहेड लॉगिंग" (वाल) विकल्प उपलब्ध है, जिसमें पढ़ना और लिखना बहुत आगे बढ़ सकता है।

डिफ़ॉल्ट रूप से, वाल सक्षम नहीं है। वाल को चालू करने के लिए, SQLite प्रलेखन देखें।


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

एक प्रैग्मा है , लॉकिंग_मॉड = एक्सक्लूसिव जिसका उपयोग डेटाबेस को किसी एकल प्रक्रिया में लॉक करने के लिए किया जा सकता है, यदि आप इस कार्यक्षमता को रोकना चाहते हैं।
स्कोवेटा

20

SQLite3 स्पष्ट रूप से कई कनेक्शनों की अनुमति देता है :

(५) क्या एक ही समय में एक ही डेटाबेस फ़ाइल में एक से अधिक एप्लिकेशन या कई इंस्टेंस एक्सेस कर सकते हैं?

एकाधिक प्रक्रियाओं में एक ही समय में एक ही डेटाबेस खुला हो सकता है। एक ही समय में कई प्रक्रियाएं चयन कर सकती हैं। लेकिन केवल एक प्रक्रिया किसी भी समय डेटाबेस में परिवर्तन कर सकती है, हालाँकि।

कनेक्शन साझा करने के लिए, SQLite3 साझा कैश का उपयोग करें :

संस्करण 3.3.0 के साथ शुरू, SQLite में एक विशेष "साझा-कैश" मोड शामिल है ( डिफ़ॉल्ट रूप से अक्षम )

3.5.0 संस्करण में, साझा-कैश मोड को संशोधित किया गया था ताकि एक ही कैश को केवल एक थ्रेड के भीतर पूरी प्रक्रिया में साझा किया जा सके।

5.0 साझा-कैश मोड को सक्षम करना

प्रति-प्रक्रिया के आधार पर साझा-कैश मोड सक्षम है। C इंटरफ़ेस का उपयोग करते हुए, निम्न API का उपयोग विश्व स्तर पर साझा-कैश मोड को सक्षम या अक्षम करने के लिए किया जा सकता है:

int sqlite3_enable_sared_cache (int);

प्रत्येक कॉल sqlite3_enable_sared_cache () प्रभाव बाद के डेटाबेस कनेक्शन sqlite3_open (), sqlite3_open16 (), या sqlite3_open_v2 () का उपयोग करके बनाई गई है। पहले से मौजूद डेटाबेस कनेक्शन अप्रभावित हैं। Sqlite3_enable_sared_cache () के लिए प्रत्येक कॉल एक ही प्रक्रिया के भीतर सभी पिछले कॉल को ओवरराइड करती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.