एक विशिष्ट उपकरण नहीं है, बल्कि यह देखने के लिए एक डिबगिंग तकनीक है कि कौन सा कोड खुला कनेक्शन या अन्य संसाधनों के लिए ज़िम्मेदार है।
मुझे लगता है कि आप एक डीबी कनेक्शन प्राप्त करने के लिए जावा पक्ष पर एक सतत विधि का उपयोग कर रहे हैं (पूल या इससे कोई फर्क नहीं पड़ता)।
विचार आपके कनेक्शन फैक्ट्री/पूल या जो भी हो, के आस-पास एक बहुत ही हल्की रैपर कक्षा बनाना है।रैपर जो भी जेडीबीसी इंटरफ़ेस समझ में आता है उसे लागू करेगा ताकि आप इसे अपने सामान्य कनेक्शन ऑब्जेक्ट के लिए स्वैप कर सकें लेकिन अधिकांश विधियां पारदर्शी रूप से अंतर्निहित कनेक्शन को कॉल/वापस कर देंगी।
यदि आप किसी प्रकार के आईओसी फ्रेमवर्क (उदा। वसंत) का उपयोग कर रहे हैं तो आप कॉन्फ़िगरेशन स्तर पर आसानी से कनेक्शन/फैक्ट्री क्लास को स्वैप करने में सक्षम होना चाहिए। अब आपका सभी जावा कोड आपके नए डीबी कनेक्शन रैपर का उपयोग करेगा।
यदि आप पूल का उपयोग कर रहे हैं, तो connection.close()
पर कॉल करना आमतौर पर कनेक्शन को नष्ट करने के बजाय पूल को ऑब्जेक्ट देता है। तो यह तकनीक सामान्य कनेक्शन रिसाव के लिए काम करती है या सिर्फ "पूल (पूल थक गया)" रिसाव में वापस नहीं आती है।
अब हमें दिलचस्प बिट्स लॉग इन करने और लीक कनेक्शन के लिए जाल सेट करने की आवश्यकता है।
स्टैक ट्रेस अपने कनेक्शन आवरण के लिए निर्माता की पहचान करने के
निर्माता या कारखाने विधि में एक नया Throwable
वस्तु बना सकते हैं और बाद में करने के लिए अपने आवरण के भीतर एक स्थानीय चर के रूप में संग्रहीत। हम Throwable
का उपयोग करते हैं क्योंकि यह Thread.currentThread().getStackTrace()
का उपयोग करने से तेज़/सस्ता है।
सेट "जाल"
अपने आवरण कक्षा में finally
विधि को लागू करें। यह एक क्लीनअप विधि है जिसे जीसी द्वारा बुलाया जाता है जब वस्तु नष्ट हो जाती है क्योंकि इसका अब उपयोग नहीं किया जाता है।
finally
विधि को जांचना चाहिए कि "क्या मैं बंद हूं?"। यदि पहले से बंद है, तो सब कुछ ठीक है ... हालांकि यदि कनेक्शन जीसीड किया जा रहा है और यह बंद नहीं किया गया है ... तो यह एक "लीक" कनेक्शन है।
अब Throwable
खेल में वापस आता है। हम Throwable
को पकड़ सकते हैं और एक अच्छा लॉग संदेश आउटपुट कर सकते हैं जैसे कुछ कहता है: "मैं एक लीक कनेक्शन हूं और यहां मेरे निर्माता को निहित एक स्टैक ट्रेस है।"
विचार
इस विधि का विस्तार स्थितियों की एक किस्म के लिए अनुकूलित किया जा सकता। आप अपने विशिष्ट मुद्दे की समस्या निवारण के लिए अपने रैपर में अन्य प्रकार के डेटा को निश्चित रूप से रख सकते हैं। उदाहरण के लिए निर्माण समय। फिर आप लंबे समय तक कनेक्शन के लिए मतदान कर सकते हैं और फिर निर्माता को निहित कर सकते हैं। या आप मौजूदा कनेक्शनों को मतदान कर सकते हैं और Throwable
स्टैक निशान का विश्लेषण कर सकते हैं ताकि डेटा प्राप्त हो सके कि कौन सा कोड समय के साथ कितने कनेक्शन का उपयोग कर रहा है।
शायद एक ऑफ-द-शेल्फ टूल है जो इन प्रकार की चीजें भी कर सकता है, लेकिन इस तकनीक को लागू करने के लिए आवश्यक कोड की मात्रा ज्यादातर मामलों में बहुत कम है (मान लीजिए कि आपके पास अपना स्वैप करने का आसान तरीका है खोज के बिना डीबी कनेक्शन फैक्ट्री - अपने पूरे कोडबेस को बदलना)।
जबकि P6Spy एक अच्छा टूल है, मुझे नहीं लगता कि यह शिकार कनेक्शन रिसाव समस्याओं के साथ कैसे मदद करता है। –