2010-04-08 4 views
6

मुझे यकीन है कि मैं कुछ बहुत स्पष्ट याद कर रहा हूँ, लेकिन मैं मुझे के जीवन के लिए मेरे pysqlite स्क्रिप्ट एक डेटाबेस के साथ बाहर दुर्घटनाग्रस्त त्रुटि लॉक किया गया है नहीं रोक सकता है। मेरे पास दो स्क्रिप्ट हैं, एक डेटाबेस में डेटा लोड करने के लिए, और एक डेटा को पढ़ने के लिए, लेकिन दोनों बार-बार, और तत्काल, किसी भी समय डेटाबेस के साथ अन्य क्या कर रहा है, इस पर निर्भर करता है। मैं 30 सेकंड के लिए सेट दोनों लिपियों पर टाइमआउट मिल गया है:अजगर/SQLite - डेटाबेस बड़े समय समाप्ति के बावजूद बंद कर दिया

cx = sqlite.connect("database.sql", timeout=30.0) 

और लगता है कि मैं मैं में समय समाप्ति के कुछ सबूत क्या एक समय टिकट प्रतीत होता देख सकते हैं (उदाहरण के लिए 0.12343827e-06 0.1 - और मैं मुद्रित होने से कैसे रोकूं?) कभी-कभी मेरे शापित के बीच में आउटपुट स्क्रीन स्वरूपित होता है, लेकिन 30 सेकंड के टाइमआउट के पास कभी भी कोई देरी नहीं होती है, लेकिन फिर भी यह एक दूसरे से बार-बार दुर्घटनाग्रस्त हो जाती है। मैं 64-बिट 4 सीपीयू एचएस 21 आईबीएम ब्लेड पर RHEL 5.4 चला रहा हूं, और बहु-थ्रेडिंग के बारे में कुछ मुद्दों के बारे में कुछ उल्लेख सुना है और यह सुनिश्चित नहीं है कि यह प्रासंगिक हो सकता है या नहीं। उपयोग में पैकेज स्क्लाइट-3.3.6-5 और पायथन-स्क्लाइट-1.1.7-1.2.1 हैं, और Red Hat के आधिकारिक प्रावधानों के बाहर नए संस्करणों में अपग्रेड करना मेरे लिए एक अच्छा विकल्प नहीं है। सामान्य रूप से पर्यावरण के कारण संभव, लेकिन वांछनीय नहीं।

मेरे पास दोनों स्क्रिप्ट्स में पहले autocommit=1 था, लेकिन तब से दोनों पर अक्षम किया गया है, और अब मैं cx.commit() डालने वाली स्क्रिप्ट पर आईएनजी और चयन स्क्रिप्ट पर काम नहीं कर रहा हूं। आखिरकार जब तक कि मेरे पास कभी भी एक स्क्रिप्ट नहीं होती है, वास्तव में कोई संशोधन कर रही है, तो मुझे वास्तव में यह नहीं पता कि यह लॉकिंग क्यों होनी चाहिए। मैंने देखा है कि समय के साथ यह काफी खराब है जब डेटाबेस बड़ा हो गया है। यह हाल ही में 3 एमबी आकार के 3 एमबी के साथ था, जो लगभग 1 दिन का डेटा था। एक नई फाइल बनाने में काफी सुधार हुआ है, जो समझ में आता है, लेकिन अंततः टाइमआउट का पालन नहीं किया जा रहा है।

किसी भी पॉइंटर्स की बहुत सराहना की गई।

संपादित करें: पूछ मैं अपने कोड थोड़ा पुनर्गठन और एक संकेत का उपयोग समय-समय पर एक लेन-देन हर 5 सेकंड में 0 और 150 के बीच के अपडेट लिखने के लिए करने में सक्षम है के बाद से। इसने लॉकिंग की घटनाओं को काफी हद तक कम कर दिया है, हर एक मिनट में एक बार के विपरीत एक घंटे से भी कम समय तक। मुझे लगता है कि जब मैं दूसरी लिपि में डेटा पढ़ता हूं, तो डेटा को लिखने के समय कुछ सेकंड तक ऑफसेट हो जाता है, लेकिन मूल रूप से मैं किसी समस्या के आसपास काम कर रहा हूं क्योंकि मैं इसे समझता हूं, एक टाइमआउट की आवश्यकता नहीं है, जो करता है अभी भी ठीक नहीं लग रहा है। टा।

उत्तर

0

SQLite प्रत्येक लेखन (अद्यतन/सम्मिलित/हटाएं/...) के लिए डेटाबेस लॉकिंग का उपयोग करता है। आईएमएचओ, लेनदेन समाप्त होने तक यह लॉक तब तक आयोजित होता है। यह धागा/प्रक्रियाओं, AFAIK भर में आयोजित एकल ताला है।

तो, मैं स्पष्ट रूप से स्क्रिप्ट लिखने के लिए दोनों लेन-देन और कनेक्शन समाप्त होने की कोशिश करता हूँ और स्पष्ट रूप से भी पढ़ने लिपि में प्रतिबद्ध और डिबग संगामिति मुद्दों के लिए प्रयास करने के लिए।

+0

क्या आप संपूर्ण डेटाबेस को बंद करना चाहते हैं? मैं लॉक होने के साथ ठीक हूं, लेकिन लॉक जारी होने के लिए न तो स्क्रिप्ट काफी देर तक प्रतीक्षा कर रही है। –

+0

हां, मेरा मतलब है कि लिखने वाले कनेक्शन से डेटाबेस से घनिष्ठ संबंध है। – Almad

+1

ठीक है, मैं हर कुछ सेकंड में डेटाबेस में लिख रहा हूं, निश्चित रूप से बंद करना वास्तव में कुछ भी नहीं बदलेगा? खोलने और बंद करने में अतिरिक्त काम है, तो क्या इससे संभवतः इससे बुरा नहीं होगा? और अगर मैं बंद होने से पहले परिवर्तन कर रहा हूं, तो इसे बंद करने में कोई फायदा नहीं है, क्योंकि यह अब लॉक नहीं होगा। –

0

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

+0

मैं निश्चित रूप से एक उचित डेटाबेस का उपयोग कर रहा हूं, लेकिन यह कई कारणों से उपलब्ध नहीं है। –

+0

ठीक है, तो कुछ चीजों को धीमा होने के लिए तैयार रहें। यह सिर्फ मदद नहीं की जा सकती है। –

2

pysqlite के प्रारंभिक संस्करणों में timeout पैरामीटर sqlite.connect को स्पष्ट रूप से मिलीसेकंड के रूप में व्याख्या किया गया है। तो आपका timeout=30.0timeout=30000 होना चाहिए।

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