इसे एक्सेस करने वाली दो अजगर प्रक्रियाओं के साथ SQLite: एक रीडिंग, एक लेखन


22

मैं दो घटकों के साथ एक छोटी सी प्रणाली विकसित कर रहा हूं: एक इंटरनेट संसाधन से एक डेटा का सर्वेक्षण करता है और स्थानीय रूप से इसे बनाए रखने के लिए इसे sql डेटा में अनुवाद करता है; दूसरा व्यक्ति स्थानीय उदाहरण से उस sql डेटा को पढ़ता है और इसे json और एक आरामदायक एपी के माध्यम से कार्य करता है।

मैं मूल रूप से पोस्टग्रैक्स्ल के साथ डेटा को बनाए रखने की योजना बना रहा था, लेकिन क्योंकि एप्लिकेशन को सेवा देने के लिए डेटा की बहुत कम मात्रा और सेवा करने के लिए ट्रैफ़िक होगा, मैंने सोचा कि यह ओवरकिल था। SQLite काम करने के लिए है? मैं छोटे पदचिह्न के विचार से प्यार करता हूं और इस एक कार्य के लिए अभी तक एक और sql सर्वर को बनाए रखने की आवश्यकता नहीं है, लेकिन मैं संगामिति के बारे में चिंतित हूं।

ऐसा लगता है कि आगे लॉगिंग सक्षम करने के साथ, समवर्ती रूप से पढ़ना और एक SQLite डेटाबेस लिखना डेटाबेस से बाहर की प्रक्रिया को लॉक किए बिना हो सकता है।

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


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

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

... पीछे। मुझे सभी विवरण याद नहीं हैं, लेकिन मुझे लगता है कि जब एक प्रक्रिया ने एक ताला प्राप्त करने की कोशिश की और इसलिए नहीं कर सका क्योंकि एक और एक पढ़ रहा था, तो यह 20-30 सेकंड की तरह कुछ पागल के लिए सो जाएगा। हमने एक समर्पित थ्रेड तैयार किया जो SQLite एक्सेस के लिए ज़िम्मेदार था और फिर हमारी दोनों प्रक्रियाएँ थीं, और उन सभी थ्रेड्स में, एक थ्रेड के लिए उनके DB अनुरोधों को क्रमबद्ध किया। अड़चन में, मैं शायद SQLite के साथ फिर से नहीं गया होगा।
डीएक्सएम

1
@DXM चेतावनी के लिए धन्यवाद, लेकिन कुछ परीक्षण चलाने के बाद मैंने कुछ भी समान के खिलाफ नहीं चलाया है। मुझे पता है कि साइक्लाइट को संस्करण 3 के साथ एक प्रमुख ओवरहाल मिला, जो 2004 के आसपास था, इसलिए मुझे आश्चर्य है कि क्या उस समय से पहले आपका नकारात्मक अनुभव वापस आता है।
bb

1
... अपने आप को, SQLite की लॉकिंग योजनाओं पर निर्भर रहने के बजाय। मैंने खुद काम नहीं किया, यह एक और टीम थी लेकिन मैंने ज्यादातर प्रतिक्रिया देने और जिज्ञासा से बाहर निकलने के लिए लूप में रखा। मैं ऑनलाइन भी गया और कुछ स्वतंत्र पठन किया और मूल लेखक का पेज पाया। इसे पढ़ने से, मुझे यह आभास हुआ कि SQLite के आविष्कारक को बस धागों से नफरत थी और उन्होंने यह नहीं देखा कि कोई भी उनका उपयोग क्यों करेगा, इसलिए a) DB को उनके साथ दिमाग में नहीं बनाया गया था और b) ताले / संरक्षण थोड़े जोड़ा गया था / बाद में हैक किया गया क्योंकि बहुत से लोगों ने इसके लिए कहा।
DXM

जवाबों:


25

आप फ़ाइल लॉकिंग और कॉन्सिक्वेंसी डॉक्यूमेंट की तलाश कर रहे हैं ।

SQLite प्रक्रियाएं संगामिति को संभालने के लिए तालों की एक श्रृंखला का उपयोग करती हैं; पढ़ने के लिए, कई प्रक्रियाएं एक SHAREDताला प्राप्त कर सकती हैं ।

एक प्रक्रिया जो लिखती है, उसे एक RESERVEDताला प्राप्त करने की आवश्यकता होगी , और केवल तब जब डिस्क में परिवर्तन को फ्लश करने के लिए यह PENDINGराज्य में स्थानांतरित हो । किसी भी पढ़ने की प्रक्रिया को फिर फ़ाइल को अनलॉक करना होगा, जिसके बाद लेखन प्रक्रिया EXCLUSIVEवास्तविक डेटाबेस फ़ाइल में लिखने के लिए स्थानांतरित करने में सक्षम है ।

क्योंकि लेखक प्रक्रिया को केवल वास्तविक लिखने के लिए डेटाबेस फ़ाइल को लॉक करने की आवश्यकता होती है (मेमोरी फ्लश, कमिट), केवल एक रीडर के साथ एक सेटअप और सिर्फ एक लेखक काफी अच्छा प्रदर्शन करेगा। मैं उम्मीद करता हूँ कि यह अच्छा प्रदर्शन करे, यदि बेहतर नहीं है, तो एक सेटअप के रूप में, केवल एक प्रक्रिया के साथ सभी पढ़ने और लिखने का काम करें।

जब आप कई प्रक्रियाओं को एक ही डेटाबेस में लिखते हैं, तो SQLite कम अनुकूल होता है, क्योंकि लेखन में PENDINGपरिवर्तनों को क्रमबद्ध करने के लिए अनन्य लॉक की आवश्यकता होती है ।


पूरी तरह से जवाब के लिए धन्यवाद Martijn! मुझे कुछ परीक्षण करने के लिए कुछ स्क्रिप्ट मिली हैं और ऐसा लगता है कि दो प्रक्रियाएं खुशी से पढ़ेगी और एक एकल sqlite उदाहरण लिख सकती हैं। मैं एक सेकंड के हर १ / १०० वें हिस्से से फायरिंग पढ़ने और लिखने के अनुरोध कर रहा था और फिर भी एक लॉकड डीबी अपवाद नहीं मिला। अजीब बात है, मुझे केवल एक बार "डेटाबेस लॉक" त्रुटि संदेश मिला था जब मैन्युअल रूप से कोशिश कर रहा था (sqlite3 कमांड लाइन क्लाइंट के साथ) कुछ पंक्तियों को हटाने के लिए जब रीड अनुरोध एक सेकंड के 1/100 वें स्थान पर मेरी स्क्रिप्ट से निकाल रहे थे। मुझे आश्चर्य है कि अगर इस तरह की त्रुटि के बाद pysql स्वचालित रूप से एक रिटायर हो जाता है।
bb

10

बस अनुगमन करना चाहता था और सभी को यह बताना था कि कार्यान्वयन सफल था। SQLite के साथ काम करना एक वास्तविक खुशी थी, और एक समय में इसे लिखने की केवल एक प्रक्रिया के साथ हमारे पास कभी भी लॉक-अप के मुद्दे नहीं थे ... यहां तक ​​कि बहुत तेजी से समवर्ती माध्यमिक प्रक्रिया से पढ़ता है।

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