30

मैं वर्तमान में एक ASP.net 2.0 आवेदन पर कुछ GUI परीक्षण कर रहा हूँ। आरडीबीएमएस एसक्यूएल सर्वर 2005 है मेजबान जीत सर्वर 2003/IIS 6.0 है।कैसे एक ASP.net अनुप्रयोगों में SqlServer कनेक्शन रिसाव का पता लगाने के लिए?

मैं क्योंकि उसे किसी बाहरी कंपनी है जो कोड जारी नहीं कर रहा है द्वारा प्रोग्राम किया गया था आवेदन के स्रोत कोड नहीं है।

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

मुझे लगता है कि नेट कचरा कलेक्टर अंततः उन्हें बंद हो जाएगा लेकिन ... कि कोई कुछ समय लग सकता है,?

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

सब है कि ऊपर कहा जा रहा है से, यहाँ कुछ मुख्य प्रश्न से संबंधित प्रश्न हैं:

  1. वहाँ किसी भी तरह से एसक्यूएल में पता करने के लिए है सर्वर 2005 यदि कनेक्शन हैं खुला क्योंकि वे करने के लिए प्रतीक्षा कर रहे हैं जा एक कनेक्शन पूल में प्रयोग किया जाता है या यदि वे खुले रहे क्योंकि वे एक आवेदन के द्वारा उपयोग किया जाता है?

  2. somone अच्छा ऑनलाइन/कागज संसाधनों जहाँ मैं सीख सकते हैं कि कैसे प्रदर्शन काउंटर या उपकरण के कुछ अन्य प्रकार का उपयोग करने के मुद्दों इस तरह के नीचे ट्रैक करने में मदद करने के लिए के बारे में पता है?

  3. यदि प्रदर्शन काउंटर सबसे अच्छे समाधान हैं, तो मैं क्या देख सकता हूं कि को देखना चाहिए?

+0

कनेक्शन पूलिंग सक्षम है? –

+0

डिफ़ॉल्ट रूप से सक्षम नहीं है? –

+0

हां। जब मुझे एक समान समस्या का सामना करना पड़ा, तो मैंने पाया कि यह आवेदन में झूठा था। –

उत्तर

2

तुम हमेशा web.config से कनेक्शन तार जाँच कर सकते हैं (मुख्य रूप से अगर वे कनेक्शन पूलिंग, सक्रिय अगर वे किसी तरह के संबंध सीमा सक्षम होनी है)।

इसके अलावा, अगर आप आईआईएस 6 का उपयोग कर रहे हैं, तो आपको एक अलग आवेदन पूल का उपयोग करने के लिए अपने वेब आवेदन निर्धारित करते हैं, और स्मृति और प्रक्रियाओं की रीसाइक्लिंग के लिए अन्य विकल्प सेट कर सकते हैं।

प्रदर्शन काउंटरों के बारे में, आप जांच कर सकता है कितनी देर तक कचरा कलेक्टर चल रहा है, कितनी स्मृति आवेदन उपयोग कर रहा है, आदि

आप एसक्यूएल सर्वर तक पहुँच है, तो आप से बनाए गए कनेक्शन की निगरानी कर सकता है आपका एप्लिकेशन (SQL सर्वर के प्रत्येक स्थापित इंस्टेंस के लिए परिभाषित प्रदर्शन काउंटर हैं)।

MSDN Magazine में कुछ लेख थे। इसके अलावा आप एप्लिकेशन की प्रक्रिया से जुड़ने के लिए एसओएस डीबगिंग लाइब्रेरी का उपयोग कर सकते हैं और इसे मैन्युअल रूप से जांच सकते हैं।

और, यदि आप स्रोत कोड नहीं है, (वे डिबगिंग के लिए बहुत उपयोगी हो जाएगा) Reflector उपयोग करने के लिए आवेदन के स्रोत प्राप्त करने की कोशिश

@Later संपादित करें: आप इस question यहाँ की जांच कर सकता stackoverflow.com पर भी

1

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

मैं कहूंगा कि अगर समाधान आईआईएस को पुनरारंभ करना है, तो आप यह देखने के लिए एप्लिकेशन के मेमोरी उपयोग को भी देख सकते हैं कि स्मृति मेमोरी है या कुछ ऐसा है जो वास्तव में इसके पदचिह्न को विकसित करता है।

तो खुले कनेक्शनों एक मुद्दा थे, गतिविधि में नजर रखने के आप बिना किसी गतिविधि के कनेक्शन की एक बहुत बड़ी संख्या में देखना होगा। प्रदर्शन वस्तु:

प्रदर्शन काउंटरों कि "सामान्य आँकड़े एसक्यूएल सर्वर" को देख शुरू हो सकता है के लिए

2

एमएसडीएन संदर्भ (ADO.NET performance counters) के बारे में बहुत स्पष्ट है कि आप आवेदन को प्रोफाइल करते समय क्या देख सकते हैं। आप विंडोज में निर्मित perfmon एप्लिकेशन का उपयोग कर काउंटरों की निगरानी कर सकते हैं।

इसके अलावा, मैं एडीओ.NET कनेक्शन पूलिंग के बारे में सीखने का सुझाव दूंगा। यदि आपको वास्तव में उनके कोड में एक बग पर संदेह है, तो आप इसे Red Gate's Reflector (अब के लिए नि: शुल्क) का उपयोग करके देख सकते हैं जो एमएसआईएल को सी # में अलग करता है।

6

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

+2

प्रोफाइलर में "sp_reset_connection" गायब होने के लिए बाहर देखना एक महान युक्ति है, धन्यवाद! – Constantin

1

टोड Denlinger एक शानदार वर्ग http://www.codeproject.com/KB/database/connectionmonitor.aspx कौन सा है जो ठीक से समय की अवधि के भीतर निपटारा नहीं किया गया है पर Sql सर्वर कनेक्शन और रिपोर्ट देखता लिखा था। इसे अपनी साइट पर वायर करें, और यह आपको रिसाव होने पर बताएगा।

53

इस धागे को एक ही समस्या का शोध करने में मिला।

SELECT S.spid, login_time, last_batch, status, hostname, program_name, cmd, 
(
     select text from sys.dm_exec_sql_text(S.sql_handle) 
) as last_sql 
FROM sys.sysprocesses S 
where dbid > 0 
and DB_NAME(dbid) = '<my_database_name>' 
and loginame = '<my_application_login>' 
order by last_batch asc 

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

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

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

+1

यह क्वेरी बहुत उपयोगी थी। मैं कुछ ही मिनटों में एक गंभीर कनेक्शन रिसाव को इंगित करने में सक्षम था। धन्यवाद! –

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