2009-10-26 11 views
7

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

बग मूल रूप से एक कट और पेस्ट त्रुटि की तरह दिखता है। हम कुछ वर्गों है कि डीबी कनेक्शन का प्रबंधन है, तो यह इस तरह मोटे तौर पर दिखता है:

OurDBConn conn1 = ConnectionManager.getConnection(); 
try { 
    // business logic 
} catch() { 
    // 
} finally { 
    ConnectionManager.returnConnection(conn1); 
} 

/// and then later in the same method 
OurDBConn conn2 = ConnectionManager.getConnection(); 
try { 
    // business logic 
} catch() { 
    // 
} finally { 
    ConnectionManager.returnConnection(conn1); // NOTE Error: conn1 should be conn2 
} 

मैं क्यों पहले कोडर सिर्फ मूल कनेक्शन पुन: उपयोग नहीं किया था पता नहीं है, लेकिन यह है कि क्या यह

है

(संपादित करें/संलग्न करें)

हां, कनेक्शन कोड भी हमारा है और इसलिए मैं दिए गए उत्तरों का उपयोग कर सकता हूं।

हालांकि, मुझे नहीं लगता कि मैंने सही सवाल पूछा है, हालांकि नीचे दिए गए उत्तरों का जवाब मैंने पूछा है। मुझे यकीन नहीं है कि सही स्टैक ओवरफ्लो क्या करना है; एक और सवाल पूछें, या इसे संपादित करें?

मुझे एक प्रश्न पूछा जाना चाहिए था: इन अनाथ, अन-बंद कनेक्शन सिस्टम प्रदर्शन में खुद को कैसे प्रकट करेंगे? साथ ही, चूंकि ये कनेक्शन ऑब्जेक्ट केवल एक निश्चित विधि के दायरे में मौजूद हैं, तो कनेक्शन कचरा संग्रहण के लिए योग्य नहीं होंगे? और फिर यदि वे gceded हैं, तो खुले कनेक्शन का प्रभाव gc'ed क्या है?

(अंत संपादित करें)

+0

मैं इसे एक करीबी देख रहा हूं, हमारी कई परियोजनाओं में हमें एक जैसी ही समस्या है। – Tenner

+1

रिकॉर्ड के लिए, मुझे वास्तव में एक अच्छा कारण होना चाहिए कि इसे परिपक्व कनेक्शन पूल कार्यान्वयन जैसे डीबीसीपी या सी 3 पीओ में स्थानांतरित न करें - यदि आपके पास अवसर है - शायद आपको ऐसा करने पर विचार करना चाहिए? एओपी दृष्टिकोण – teabot

उत्तर

7

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

फिर मांग पर इस मानचित्र तक पहुंचने के लिए कुछ उचित तरीका जोड़ें और आप अच्छे हैं। आपके पर्यावरण के आधार पर, एक शटडाउन हुक जोड़ना जो मानचित्र की सामग्री को किसी फ़ाइल में डंप करता है, और/या कोड चलाने में अनलॉक कनेक्शन के सेट को देखने के लिए जेकोनसोल इंटरफ़ेस जोड़ना, दोनों अच्छे विकल्प हो सकते हैं।

यदि कनेक्शन प्रबंधक आपका कोड नहीं है, तो आप अभी भी पहलुओं का उपयोग करके एक ही चीज़ प्राप्त कर सकते हैं।

+0

+1 हम जिस कनेक्शन पूल का उपयोग करते हैं वह ऐसा कुछ करता है; मेरा मानना ​​है कि यह उन कनेक्शनों को लपेटता है जो यह लौटाता है, और जब उनका उपयोग किया जाता है तो इसका ट्रैक रखता है। यदि किसी कनेक्शन को कॉन्फ़िगरेशन में निर्दिष्ट कुछ निश्चित समय से अधिक समय तक उपयोग नहीं किया जाता है, तो कनेक्शन स्वचालित रूप से समाप्त हो जाएगा और कनेक्शन खोलने पर रिकॉर्ड किए गए स्टैक ट्रेस को लॉग पर मुद्रित किया जाता है। – teabot

+0

के लिए – RMorrisey

0

आप कस्टम मिनी-फ्रेमवर्क को कार्यान्वित कर सकते हैं या जेडीबीसी संचालन पर पतली रैपर के रूप में exisitng एक का उपयोग कर सकते हैं। उदाहरण के लिए spring-jdbc मॉड्यूल (mavenized) है जो डेवलपर से बॉयलरप्लेट त्रुटि-प्रवण कोड को कवर करता है।

आप अपने usage examples देख सकते हैं और देख सकते हैं कि क्लाइंट कोड पर कोई प्रारंभिक/सफाई नहीं है! यह 'टेम्पलेट विधि' पैटर्न का उपयोग करता है, यानी आप केवल आवश्यक डेटा प्रोसेसिंग लिखते हैं और कनेक्शन/कथन/परिणाम बनाने और समापन के साथ परेशान नहीं करते हैं। इसलिए, पहली बार आपने जिस समस्या से बात की थी, उसे पेश करना संभव नहीं हो सकता है।

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