2010-01-21 7 views
11

जावा में डेटाबेस कनेक्शन उपयोग की जांच के लिए एक अच्छा उपकरण क्या है?जावा में डेटाबेस कनेक्शन उपयोग की जांच के लिए एक अच्छा उपकरण क्या है?

एक डेवलपर एक जटिल जावा प्रोग्राम का समर्थन कर रहा है जो उपलब्ध डेटाबेस कनेक्शन की संख्या को थकाऊ कर रहा है। चूंकि समस्या स्पोरैडिक है, यह जानना उपयोगी होगा कि किस क्षेत्र ने इस क्षेत्र में प्रयासों पर ध्यान केंद्रित करने के लिए डेटाबेस से कई कनेक्शन खोले हैं।

अंत में, सही फ़िक्स कनेक्शन को पुन: उपयोग करने के लिए प्रोग्राम को फिर से लिखना और प्रति थ्रेड एकाधिक कनेक्शन नहीं खोलना प्रतीत होता है।

मैं पूछ रहा हूं कि डेवलपर के पास अपने टूल बॉक्स में संसाधनों की जांच करने में सक्षम होने के लिए कौन से टूल्स हैं, यानी डेटाबेस कनेक्शन जो थ्रेड द्वारा आवंटित किए गए हैं।

उत्तर

3

एक विशिष्ट उपकरण नहीं है, बल्कि यह देखने के लिए एक डिबगिंग तकनीक है कि कौन सा कोड खुला कनेक्शन या अन्य संसाधनों के लिए ज़िम्मेदार है।

मुझे लगता है कि आप एक डीबी कनेक्शन प्राप्त करने के लिए जावा पक्ष पर एक सतत विधि का उपयोग कर रहे हैं (पूल या इससे कोई फर्क नहीं पड़ता)।

विचार आपके कनेक्शन फैक्ट्री/पूल या जो भी हो, के आस-पास एक बहुत ही हल्की रैपर कक्षा बनाना है।रैपर जो भी जेडीबीसी इंटरफ़ेस समझ में आता है उसे लागू करेगा ताकि आप इसे अपने सामान्य कनेक्शन ऑब्जेक्ट के लिए स्वैप कर सकें लेकिन अधिकांश विधियां पारदर्शी रूप से अंतर्निहित कनेक्शन को कॉल/वापस कर देंगी।

यदि आप किसी प्रकार के आईओसी फ्रेमवर्क (उदा। वसंत) का उपयोग कर रहे हैं तो आप कॉन्फ़िगरेशन स्तर पर आसानी से कनेक्शन/फैक्ट्री क्लास को स्वैप करने में सक्षम होना चाहिए। अब आपका सभी जावा कोड आपके नए डीबी कनेक्शन रैपर का उपयोग करेगा।

यदि आप पूल का उपयोग कर रहे हैं, तो connection.close() पर कॉल करना आमतौर पर कनेक्शन को नष्ट करने के बजाय पूल को ऑब्जेक्ट देता है। तो यह तकनीक सामान्य कनेक्शन रिसाव के लिए काम करती है या सिर्फ "पूल (पूल थक गया)" रिसाव में वापस नहीं आती है।

अब हमें दिलचस्प बिट्स लॉग इन करने और लीक कनेक्शन के लिए जाल सेट करने की आवश्यकता है।

स्टैक ट्रेस अपने कनेक्शन आवरण के लिए निर्माता की पहचान करने के

निर्माता या कारखाने विधि में एक नया Throwable वस्तु बना सकते हैं और बाद में करने के लिए अपने आवरण के भीतर एक स्थानीय चर के रूप में संग्रहीत। हम Throwable का उपयोग करते हैं क्योंकि यह Thread.currentThread().getStackTrace() का उपयोग करने से तेज़/सस्ता है।

सेट "जाल"

अपने आवरण कक्षा में finally विधि को लागू करें। यह एक क्लीनअप विधि है जिसे जीसी द्वारा बुलाया जाता है जब वस्तु नष्ट हो जाती है क्योंकि इसका अब उपयोग नहीं किया जाता है।

finally विधि को जांचना चाहिए कि "क्या मैं बंद हूं?"। यदि पहले से बंद है, तो सब कुछ ठीक है ... हालांकि यदि कनेक्शन जीसीड किया जा रहा है और यह बंद नहीं किया गया है ... तो यह एक "लीक" कनेक्शन है।

अब Throwable खेल में वापस आता है। हम Throwable को पकड़ सकते हैं और एक अच्छा लॉग संदेश आउटपुट कर सकते हैं जैसे कुछ कहता है: "मैं एक लीक कनेक्शन हूं और यहां मेरे निर्माता को निहित एक स्टैक ट्रेस है।"

विचार

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

शायद एक ऑफ-द-शेल्फ टूल है जो इन प्रकार की चीजें भी कर सकता है, लेकिन इस तकनीक को लागू करने के लिए आवश्यक कोड की मात्रा ज्यादातर मामलों में बहुत कम है (मान लीजिए कि आपके पास अपना स्वैप करने का आसान तरीका है खोज के बिना डीबी कनेक्शन फैक्ट्री - अपने पूरे कोडबेस को बदलना)।

7

log4jdbc पर एक नज़र डालें। यह आपको अपने जेडीबीसी पर चलने वाली सभी चीजों को देखने में सक्षम बनाता है, जिसमें खोलने/समापन कनेक्शन के साथ-साथ कनेक्शन नंबर की जानकारी भी शामिल है।

4

किसी से पता चला मुझे ConnLeakFinder हाल ही में, "JDBC कनेक्शन लीक जावा कोड में इंगित करने के लिए एक सरल उपकरण"। मैंने अब तक इसका परीक्षण नहीं किया है, लेकिन आपको की अनुमति देनी चाहिए यह देखने के लिए कि का उपयोग करने के बाद कनेक्शन बंद नहीं किया गया है। Connection+Leak+How+To+Find.htm देखें।

लेकिन वास्तव में, आपको कनेक्शन पूल का उपयोग करने के लिए कंसल्डर होना चाहिए (उदाहरण के लिए c3p0)।

0

P6Spy उन अनुप्रयोगों का समर्थन करने के लिए एक ओपन सोर्स फ्रेमवर्क है जो डेटाबेस स्टेटमेंट को अवरुद्ध और वैकल्पिक रूप से संशोधित करता है।

http://www.p6spy.com/about.html
P6Spy वितरण से निम्नलिखित मॉड्यूल शामिल हैं:

  • P6Log। P6Log जेडीबीसी का उपयोग करने वाले किसी भी एप्लिकेशन के डेटाबेस विवरणों को अवरुद्ध करता है और लॉग करता है। यह एप्लिकेशन विशेष रूप से डेवलपर्स के लिए ईजेबी सर्वर द्वारा उत्पादित SQL कथनों की निगरानी करने के लिए उपयोगी है, जिससे डेवलपर को कोड लिखने में सक्षम बनाता है जो सर्वर पर अधिकतम दक्षता प्राप्त करता है। P6Spy को मिनटों में स्थापित करने के लिए डिज़ाइन किया गया है और इसमें कोई कोड परिवर्तन की आवश्यकता नहीं है।
  • P6Outage। P6Outage लंबे समय से चलने वाले बयानों का पता लगाता है जो डेटाबेस आउटेज समस्या का संकेत हो सकता है और किसी भी कथन को लॉग करेगा जो इसके निष्पादन के दौरान कॉन्फ़िगर करने योग्य समय सीमा को पार करता है। P6Outage को केवल लंबे समय तक चलने वाले बयान दर्ज करके किसी भी लॉगिंग प्रदर्शन दंड को कम करने के लिए डिज़ाइन किया गया था।
+2

जबकि P6Spy एक अच्छा टूल है, मुझे नहीं लगता कि यह शिकार कनेक्शन रिसाव समस्याओं के साथ कैसे मदद करता है। –

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