2010-11-04 14 views
6

मैं SQLite (3.7.3)बचना sqlite3 डेटाबेस बंद कर दिया

मैं डेटाबेस बंद कर दिया त्रुटि है कि काफी प्रचलित हो रहा है मार रहा हूँ का उपयोग करता है एक बहु आवेदन किया है। मैं सोच रहा हूं कि मेरे मामले में इससे कैसे बचें।

मुझे बताएं कि मैं क्या बना रहा हूं। क्षमा करें, कोई कोड यह बहुत बड़ा और जटिल नहीं है।

मेरे पास लगभग 8 धागे हैं जो डेटाबेस के साथ-साथ पहुंचते हैं। उन धागे में से कोई भी एक ही समय में पढ़ या लिख ​​सकता है।

डेटाबेस में किसी तालिका में प्रत्येक पंक्ति में एक फ़ाइल पथ होता है जो उस संसाधन से संबंधित संसाधन + अन्य विशेषताओं को इंगित करता है।

नोट के 3 फ़ील्ड पाठक, स्थिति और डेल हैं।

पाठकों हर बार एक धागा संसाधन से पढ़ता वृद्धि की जाती है, लेकिन केवल तभी स्थिति> 0 और डेल = 0.

तो मुझे लगता है कि

UPDATE resource set readers=readers+1 where id=? AND del=0 AND status>0 

करता है उसके बाद कुछ एसक्यूएल, मैं जाँच की है पंक्तियों की संख्या अद्यतन। यह केवल 1. होना चाहिए इसके बाद मैं एक चयन के साथ पंक्ति को वापस पढ़ने की कोशिश करता हूं। मैं ऐसा करता हूं कि अगर यह अद्यतन करने के लिए विफल रहा है क्योंकि मुझे यह जानने की आवश्यकता है कि यह विफल रहा है।

मैंने दोनों लेनदेन में अपडेट और चयन को लपेटने की कोशिश की लेकिन इससे मदद नहीं मिली। मैंने जांच की है कि मैं भी अपने बयान पर अंतिम रूप दे रहा हूं।

अब, मैंने सोचा था कि एसक्लाइट डिफ़ॉल्ट रूप से क्रमबद्ध करता है। मैंने कुछ खुले मोड की कोशिश की है लेकिन मुझे अभी भी वही त्रुटि मिलती है।

और इससे पहले कि आप पूछें, नहीं, मैं mysql पर जाने का इरादा नहीं रख रहा हूं। मुझे बिल्कुल शून्य विन्यास की आवश्यकता है।

क्या कोई इस प्रकार की समस्या से बचने के तरीके पर कुछ पॉइंटर्स प्रदान कर सकता है? क्या मुझे पाठकों को डीबी से बाहर ले जाना चाहिए? अगर मैं ऐसा करता हूं तो मुझे इसे किस तंत्र से बदलना चाहिए? मैं सी ++ के तहत लिनक्स का उपयोग कर रहा हूं और बूस्ट लाइब्रेरी उपलब्ध है।

संपादित करें: दिलचस्प बात यह है कि मेरे अपडेट किए गए कॉल के बाद COMMIT को नाटकीय रूप से सुधारने के बाद COMMIT जोड़ना।

+1

अधिकांशतः प्रतिबद्धता डेटाबेस फ़ाइल पर अधिक बारीक विशिष्ट ताले की अनुमति देती है, जो पाठकों को अनलॉक करने के लिए प्रतीक्षा करने वाले समय पाठकों को कम करने में कमी करेगी। यह बढ़ी जर्नल फ़ाइल ओवरहेड की कीमत पर आता है। अधिक जानकारी के लिए http://sqlite.org/lockingv3.html#writing देखें। – checker

उत्तर

1

जब आप db खोलते हैं, तो आप 'व्यस्त समय समाप्त' कॉन्फ़िगर करना चाहिए

int sqlite3_busy_timeout(sqlite3*, int ms); 

http://www.sqlite.org/c3ref/busy_timeout.html

+2

हाय, हाँ मैंने कोशिश की। यह थोड़ा सा मदद करता है। लेकिन जब भी इसे 1 सेकंड के रूप में उच्च सेट किया जाता है तब भी यह लॉक समस्या में चला जाता है। मैंने shared_cache मोड को सक्षम किया है और यह व्यस्त टाइमआउट से अधिक मदद करता है। मैं दोनों कोशिश करने जा रहा हूँ। – Matt

+0

यह पता चला है कि एसकलाइट को मेरे ऐप के लिए बहुत कठिन तरीके से हथियार लगाया जा रहा था। तो मैंने पाठकों को फ़ील्ड को स्मृति में स्थानांतरित कर दिया है। इसने 10000% के प्रदर्शन में सुधार किया है और मैं हार्ड ड्राइव कम कम कर रहा हूं। – Matt

1

पहला सवाल: आप के साथ सभी आठ धागे एक कनेक्शन का उपयोग करने की कोशिश कर रहे हैं? यदि ऐसा है, तो सुनिश्चित करें कि प्रत्येक थ्रेड का अपना कनेक्शन हो। मैं किसी भी डेटाबेस को नहीं जानता जो इसे पसंद करता है। http://www.sqlite.org/faq.html

जाहिर SQLite एक SQLITE_THREADSAFE पूर्वप्रक्रमक विकल्प 1. वे पाते हैं कि यदि आपकी समस्या है निर्धारित करने के लिए एक विधि है करने के लिए सेट के साथ संकलित किया जाना है:

इसके अलावा सामान्य प्रश्न देखें।

एक और मुद्दा यह है कि लिखने केवल एक प्रक्रिया से सुरक्षित रूप से हो सकते हैं।

+0

हां, प्रति थ्रेड एक कनेक्शन। मैं थ्रेडसेफ प्रीप्रोसेसर विकल्प की जांच करूंगा। मैं इंप्रेशन के तहत था कि हालांकि डिफ़ॉल्ट था। – Matt

+0

मैं इस विकल्प को कैसे सेट करता हूं? – ademar111190

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