ज्यादातर मामलों में कनेक्शन पूलिंग समस्याएं कनेक्शन लीक . से संबंधित होती हैं . आपका एप्लिकेशन शायद अपने डेटाबेस कनेक्शन को सही ढंग से और लगातार बंद नहीं करता है। जब आप कनेक्शन को खुला छोड़ देते हैं, तो वे तब तक अवरुद्ध रहते हैं जब तक कि .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
, उन्हें बंद करें। भले ही कनेक्शन बंद करना ही चाल चल रहा हो, लेकिन जब आप उनका उपयोग करते हैं तो अपने डेटा रीडर ऑब्जेक्ट्स को स्पष्ट रूप से बंद करने के लिए अतिरिक्त प्रयास करें।
यह लेख "एक कनेक्शन पूल ओवरफ्लो क्यों करता है?" एमएसडीएन/एसक्यूएल पत्रिका से बहुत सारे विवरण बताते हैं और कुछ डिबगिंग रणनीतियों का सुझाव देते हैं:
- चलाएं
sp_who
याsp_who2
. ये सिस्टम संग्रहीत कार्यविधियाँsysprocesses
. से जानकारी लौटाती हैं सिस्टम तालिका जो सभी कार्य प्रक्रियाओं की स्थिति और जानकारी दिखाती है। आम तौर पर, आप प्रति कनेक्शन एक सर्वर प्रोसेस आईडी (SPID) देखेंगे। यदि आपने कनेक्शन स्ट्रिंग में एप्लिकेशन नाम तर्क का उपयोग करके अपने कनेक्शन का नाम दिया है, तो आपके काम करने वाले कनेक्शन ढूंढना आसान हो जाएगा। - SQLProfiler के साथ SQL सर्वर प्रोफाइलर का उपयोग करें
TSQL_Replay
खुले कनेक्शन का पता लगाने के लिए टेम्पलेट। यदि आप Profiler से परिचित हैं, तो sp_who का उपयोग करके मतदान करने की तुलना में यह विधि आसान है। - पूल और कनेक्शन की निगरानी के लिए प्रदर्शन मॉनिटर का उपयोग करें। मैं इस विधि पर एक पल में चर्चा करता हूं।
- कोड में प्रदर्शन काउंटरों की निगरानी करें। आप काउंटरों को निकालने के लिए रूटीन का उपयोग करके या नए .NET PerformanceCounter नियंत्रणों का उपयोग करके अपने कनेक्शन पूल के स्वास्थ्य और स्थापित कनेक्शनों की संख्या की निगरानी कर सकते हैं।