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 .Open
i Close
zgł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 Close
metodę. 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 SqlDataReader
lub 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_who
lub sp_who2
. Te systemowe procedury składowane zwracają informacje z sysprocesses
tabeli 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_Replay
szablonem 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.