2010-05-05 21 views
11

पृष्ठभूमि: मैं अपने आवेदन को npgsql v1 से npgsql v2.0.9 में ले जा रहा हूं। मेरे आवेदन को चलाने के कुछ मिनटों के बाद, मुझे एक सिस्टम मिलता है। अपवाद: पूल से कनेक्शन प्राप्त करते समय टाइमआउट।npgsql लीकिंग पोस्टग्रेज़ डीबी कनेक्शन: कनेक्शन की निगरानी करने का तरीका?

वेब का दावा है कि यह कनेक्शन लीक करने के कारण है (एक डीबी कनेक्शन खोलना, लेकिन उन्हें ठीक से बंद नहीं करना)।

तो

मैं npgsql में postgres कनेक्शन लीक निदान करने के लिए कोशिश कर रहा हूँ।

आसपास के विभिन्न वेब साहित्य से; लीकिंग कनेक्शन का निदान करने का एक तरीका है npgsql पर लॉगिंग सेट करना, और लॉग में लीकिंग कनेक्शन चेतावनी संदेश की तलाश करना। समस्या यह है कि, मैं इस संदेश को कहीं भी लॉग में नहीं देख रहा हूं।

मुझे उपयोगिता भी मिली जो npgsql कनेक्शन पर नज़र रखता है, लेकिन यह अस्थिर और दुर्घटनाग्रस्त है।

तो मुझे मैन्युअल रूप से कोड का निरीक्षण छोड़ दिया गया है। प्रत्येक जगह जो एक npgsql कनेक्शन बनाता है, उसके लिए आखिरकार ब्लॉक का निपटान होता है। प्रत्येक स्थान के लिए जो एक डाटाएडर खोलता है, कमांडबिहियर। क्लोजकनेक्शन का उपयोग किया जाता है (और डेटरेडर का निपटारा किया जाता है)।

कोई अन्य स्थान जांचने के लिए या कोई पूल कनेक्शन लीक करने के लिए एक तरीका सुझा सकता है?

+0

मुझे एक ही समस्या है। लेकिन जब मैं डीबीकनेक्शन का उपयोग करता हूं तो मुझे कनेक्शन केवल रिसाव मिलते हैं। बेजिन ट्रान्सएक्शन और डीबीट्रांसक्शन। कॉमिट/रोलबैक। मैं यह सुनिश्चित कर रहा हूं कि मैं सभी कनेक्शनों को ठीक से बंद/निपटान करता हूं लेकिन कोई मदद नहीं करता हूं। मुझे लगता है कि यह एनपीजीएसक्ल के साथ ही एक समस्या है, न कि हमारे कोड। यदि आपको समाधान मिल गया है तो मुझे बताएं। धन्यवाद। – Fung

उत्तर

7

अपडेट: मैं यह जांचने के लिए एक बेहतर तरीके से काम कर रहा हूं कि उन रिसाव कनेक्शन आवंटित किए गए थे। कृपया, इसके बारे में मेरी पोस्ट देखें: http://fxjr.blogspot.com/2012/11/better-tracing-of-npgsql-connection.html मुझे आशा है कि इससे मदद मिलती है।

संपादित करें: आप हमारे नवीनतम बीटा संस्करण 2.0.11.91 को आजमा सकते हैं। हमने कनेक्शन पूल को बेहतर बनाने के लिए कुछ और कोड जोड़े जो आपकी मदद कर सकते हैं।

हम्मम्म, यह बहुत अजीब है .... आपको कुछ संदेश मिलना चाहिए।

वे संदेश केवल तब दिखाई देते हैं जब ms.net रनटाइम ऑब्जेक्ट को अंतिम रूप देता है। क्या यह संभव है कि आप एक ही समय में डिफ़ॉल्ट अधिकतम कनेक्शन से अधिक उपयोग कर रहे हों? मेरा मतलब है, आपका पीक उपयोग 20 अधिकतम संख्या कनेक्शन से अधिक हो सकता है ...

मुझे उम्मीद है कि इससे मदद मिलती है।

कृपया मुझे बताएं कि आपको क्या मिलता है।

+0

भले ही मैं कनेक्टन को 100 तक क्रैंक करता हूं, फिर भी मैं इस अपवाद के साथ समाप्त होता हूं। मैं बहुत सकारात्मक हूं कि हम कई कनेक्शन का उपयोग नहीं कर रहे हैं। – Alan

+1

क्या आप कनेक्शन पूलिंग अक्षम करने का प्रयास कर सकते हैं और जांच सकते हैं कि क्या आप सर्वर में फ़्लोटिंग कनेक्शन देखते हैं? आप अपने कनेक्शन स्ट्रिंग में पूलिंग = झूठी जोड़कर पूलिंग को अक्षम कर सकते हैं। यदि आप अपने पीजी सर्वर में कनेक्शन देखते समय कुछ समय के लिए अपने ऐप का उपयोग करने के बाद, आप कनेक्शन लीक कर सकते हैं। मुझे उम्मीद है कि यह मदद करता है। –

+2

हाय फ्रांसिस्को, आपकी मदद के लिए धन्यवाद। जैसा कि आपने सुझाव दिया है, मैंने पूलिंग = झूठी का उपयोग करके पूलिंग अक्षम कर दी है। कनेक्शन की निगरानी करने के लिए मैं 'SELECT * से pg_stat_activity' SQL क्वेरी का उपयोग कर रहा हूं। मैंने देखा सबसे अधिक कनेक्शन 11 था, फिर यह 3 या 4 तक की ओर झुकने और वापस नीचे 1 (एसक्यूएल क्वेरी के लिए) वापस चला गया। एक तरफ, पूलिंग को अक्षम करने से वास्तव में npgsql/postgres के प्रदर्शन को धीमा कर दिया जाता है। – Alan