2012-04-26 8 views
44

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

+0

संबंधित प्रश्न यहां देखें .. http: // stackoverflow।कॉम/प्रश्न/12117016/रणनीतियों के लिए-समवर्ती-पढ़ने-लेखन-और-पढ़ने-इन-स्क्लाइट/24038860 # 24038860 – Nepster

उत्तर

76

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

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

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

संस्करण 3.7.0 के साथ शुरुआत, एक नया “Write Ahead Logging” (WAL) विकल्प उपलब्ध है, जिसमें पढ़ने और लेखन समवर्ती रूप से आगे बढ़ सकते हैं।

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

+0

journal_mode = WAL मेरी समस्या हल करता है! –

11

SQLite3 स्पष्ट multiple connections अनुमति देता है:

(5) कर सकते हैं एक से अधिक आवेदन या एक ही आवेदन का उपयोग एक ही समय में एक एकल डाटाबेस फ़ाइल के कई उदाहरण?

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

बंटवारे कनेक्शन के लिए, का उपयोग SQLite3 shared cache:

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

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

5.0 को सक्षम करने से साझा-संचय मोड

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

int sqlite3_enable_shared_cache (int);

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

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

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