2012-07-31 21 views
22

से कनेक्शन प्रदान करने में असमर्थ रहा है, मैं एंड्रॉइड में डेटाबेस हैंडलिंग के लिए GreenDAO का उपयोग कर रहा हूं। कई डेटाबेस परिवर्तन करते समय (> 15.000) मुझे यह त्रुटि मिलती है संदेश:कनेक्शन पूल थ्रेड

डेटाबेस '/ डेटा/डेटा/...' के लिए कनेक्शन पूल थ्रेड 312 (थ्रेड -312) से कनेक्शन प्रदान करने में असमर्थ रहा है) 30.000002 सेकंड के लिए झंडे 0x1 के साथ।

सब कुछ अटक गया है। यह त्रुटि क्यों होती है?

+0

कृपया इस मुद्दे पर अधिक जानकारी प्रदान करें। जैसे स्टैक निशान, क्या यह सभी परीक्षण उपकरणों पर होता है ?, एंड्रॉइड संस्करणों का परीक्षण किया गया, ... –

+0

मुझे एक ही समस्या मिली। कोई स्टैक ट्रेस नहीं है, यह वही त्रुटि दोहराई गई है और अब मैं डेटाबेस तक नहीं पहुंच सकता। मुझे आश्चर्य है कि ग्रीनडाओ में कहीं भी खुले लेनदेन हैं लेकिन अंत में खंड में लेनदेन खत्म नहीं करते हैं। – Hiep

उत्तर

8

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

क्षमा करें कि वास्तव में कोई जवाब नहीं है, लेकिन आपको यह देखने के लिए ग्रीनडाओ के दस्तावेज़ों को देखने की आवश्यकता होगी।

+1

ग्रीनडाओ किसी भी कनेक्शन पूल का उपयोग नहीं करता है। GreenDAO के साथ ऐप्स SQLite का उपयोग कर कई एंड्रॉइड ऐप्स की तरह व्यवहार करते हैं। आप SQLiteOpenHelper के किसी प्रकार का उपयोग कर SQLiteDatabase प्राप्त करते हैं। दाओमास्टर/दाओसेशन के उदाहरण इस SQLiteDatabase ऑब्जेक्ट का संदर्भ लें। –

32

मुझे यह संदेश मिला जब मैं किसी तालिका पर एक क्वेरी चुनना चाहता हूं जिसका लेनदेन पर पहले लेनदेन के बिना उपयोग किया जाता है। अंततः लेनदेन के ब्लॉक पर endTransaction() निष्पादित करते समय समस्या हल हो गई।

+1

बड़े डेटासेट आयात करते समय बैच बनाने के बारे में भी सोचें। कहें, 'एंडट्रांसक्शन() 'बनाएं और एन इकाइयों के बाद एक नया लेनदेन शुरू करें। – melbic

0

मुझे यह संदेश मिला जब SQLite को DBFlow FlowQueryList के माध्यम से बहुत से कनेक्शन बनाते हैं। मेरा समाधान यह सुनिश्चित करना था कि क्वेरी सूची में endTransactionAndNotify() पर कॉल करने के लिए क्वेरी सूची के साथ और फिर close() पर कॉल करें।

कॉलिंग endTransactionAndNotify() अकेले चाल नहीं किया। मुझे उम्मीद है कि यह मदद करता है, इस धागे ने निश्चित रूप से मेरी मदद की।

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