ज्यादातर मामलों में कनेक्शन पूलिंग समस्याएं "कनेक्शन लीक" से संबंधित हैं। आपका एप्लिकेशन संभवतः अपने डेटाबेस कनेक्शन को सही और लगातार बंद नहीं करता है। जब आप कनेक्शन को खुला छोड़ देते हैं, तो वे तब तक अवरुद्ध रहते हैं जब तक कि .NET कचरा कलेक्टर उन्हें अपने Finalize()तरीके से कॉल करके आपके लिए बंद नहीं कर देता ।
आप यह सुनिश्चित करना चाहते हैं कि आप वास्तव में कनेक्शन बंद कर रहे हैं । उदाहरण के लिए निम्नलिखित कोड कनेक्शन रिसाव का कारण होगा, अगर कोड अपवाद के बीच .Openऔर Closeफेंकता है:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
सही तरीका यह होगा:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
या
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
जब आपका फ़ंक्शन एक क्लास विधि से कनेक्शन देता है, तो सुनिश्चित करें कि आप इसे स्थानीय रूप से कैश करते हैं और इसकी Closeविधि कहते हैं । आप उदाहरण के लिए इस कोड का उपयोग करके एक कनेक्शन लीक करेंगे:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
कनेक्शन पहली कॉल से वापस आ गया getConnection() बंद नहीं किया जा रहा है। आपके कनेक्शन को बंद करने के बजाय, यह रेखा एक नया निर्माण करती है और इसे बंद करने का प्रयास करती है।
यदि आप उपयोग करते हैं SqlDataReaderया ए OleDbDataReader, उन्हें बंद करें। भले ही कनेक्शन को बंद करना ही चाल को लगता है, अपने डेटा रीडर ऑब्जेक्ट्स को स्पष्ट रूप से बंद करें जब आप उनका उपयोग करते हैं।
यह लेख " क्यों एक कनेक्शन पूल अतिप्रवाह करता है?MSDN / SQL पत्रिका से " बहुत सारे विवरणों की व्याख्या करता है और कुछ डीबगिंग रणनीतियों का सुझाव देता है:
- भागो
sp_whoया sp_who2। ये सिस्टम संग्रहीत कार्यविधियाँ sysprocessesसिस्टम तालिका से जानकारी लौटाती हैं जो सभी कार्य प्रक्रियाओं के बारे में और स्थिति की जानकारी दिखाती है। आम तौर पर, आपको प्रति कनेक्शन एक सर्वर प्रक्रिया आईडी (एसपीआईडी) दिखाई देगी। यदि आपने कनेक्शन स्ट्रिंग में एप्लिकेशन नाम तर्क का उपयोग करके अपने कनेक्शन का नाम दिया है, तो आपके काम के कनेक्शन खोजने में आसान होंगे।
TSQL_Replayखुला कनेक्शन का पता लगाने के लिए SQLProfiler टेम्पलेट के साथ SQL सर्वर प्रोफाइलर का उपयोग करें । यदि आप Profiler से परिचित हैं, तो यह विधि sp_who का उपयोग करके मतदान से अधिक आसान है।
- पूल और कनेक्शन की निगरानी के लिए प्रदर्शन मॉनिटर का उपयोग करें। मैं इस विधि पर एक क्षण में चर्चा करता हूं।
- कोड में प्रदर्शन काउंटरों की निगरानी करें। आप अपने कनेक्शन पूल के स्वास्थ्य और काउंटरों को निकालने के लिए रूटीन का उपयोग करके या नए .NET PerformanceCounter नियंत्रणों का उपयोग करके स्थापित कनेक्शनों की संख्या की निगरानी कर सकते हैं।