W większości przypadków problemy z pulowaniem połączeń są związane z „przeciekami połączeń”. Twoja aplikacja prawdopodobnie nie zamyka poprawnie i konsekwentnie połączeń z bazą danych. Po pozostawieniu otwartych połączeń pozostają one zablokowane, dopóki moduł do usuwania śmieci .NET nie zamknie ich za Ciebie, wywołując ich Finalize()metodę.
Chcesz się upewnić, że naprawdę zamykasz połączenie . Na przykład następujący kod spowoduje wyciek połączenia, jeśli kod pomiędzy .Openi Closezgłasza wyjątek:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Prawidłowy sposób byłby następujący:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
lub
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Gdy funkcja zwróci połączenie z metody klasy, pamiętaj, aby buforować ją lokalnie i wywołać jej Closemetodę. Wyciekniesz z połączenia za pomocą tego kodu, na przykład:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
Połączenie zwrócone z pierwszego połączenia do getConnection()nie jest zamykane. Zamiast zamykać połączenie, ta linia tworzy nowe i próbuje je zamknąć.
Jeśli używasz SqlDataReaderlub a OleDbDataReader, zamknij je. Chociaż wydaje się, że zamknięcie samego połączenia załatwia sprawę, włóż dodatkowy wysiłek, aby jawnie zamknąć obiekty czytnika danych podczas ich używania.
W artykule „ Dlaczego przepełnienie puli połączeń? ” Z magazynu MSDN / SQL Magazine wyjaśnia wiele szczegółów i sugeruje niektóre strategie debugowania:
- Uruchom
sp_wholub sp_who2. Te systemowe procedury składowane zwracają informacje z sysprocessestabeli systemowej, która pokazuje status i informacje o wszystkich działających procesach. Zasadniczo zobaczysz jeden identyfikator procesu serwera (SPID) na połączenie. Jeśli nazwa połączenia została nazwana przy użyciu argumentu Nazwa aplikacji w ciągu połączenia, można łatwo znaleźć działające połączenia.
- Użyj SQL Server Profiler z
TSQL_Replayszablonem SQLProfiler do śledzenia otwartych połączeń. Jeśli znasz program Profiler, ta metoda jest łatwiejsza niż odpytywanie za pomocą sp_who.
- Użyj Monitora wydajności do monitorowania pul i połączeń. Omówię tę metodę za chwilę.
- Monitoruj liczniki wydajności w kodzie. Możesz monitorować kondycję swojej puli połączeń i liczbę ustanowionych połączeń za pomocą procedur do wyodrębnienia liczników lub za pomocą nowych kontrolek .NET PerformanceCounter.