Ve většině případů problémy se sdružováním připojení souvisí s úniky připojení . Vaše aplikace pravděpodobně neuzavírá svá databázová připojení správně a konzistentně. Když necháte připojení otevřená, zůstanou zablokována, dokud je za vás .NET garbage collector neuzavře voláním jejich Finalize()
metoda.
Chcete se ujistit, že skutečně ukončujete připojení . Například následující kód způsobí únik spojení, pokud je kód mezi .Open
a Close
vyvolá výjimku:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Správný způsob by byl tento:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
nebo
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Když vaše funkce vrátí spojení z metody třídy ujistěte se, že jste jej uložili do mezipaměti lokálně a zavolali jeho Close
metoda. Uvolníte připojení pomocí tohoto kódu například:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
Připojení se vrátilo z prvního volání funkce getConnection()
není uzavřen. Namísto uzavření vašeho připojení tento řádek vytvoří nové a pokusí se jej ukončit.
Pokud používáte SqlDataReader
nebo OleDbDataReader
, zavřete je. I když se zdá, že uzavření připojení samo o sobě udělá ten trik, vynaložte zvláštní úsilí na to, abyste objekty čtečky dat zavírali explicitně, když je používáte.
Tento článek "Proč fond připojení přeteče?" z MSDN/SQL Magazine vysvětluje mnoho podrobností a navrhuje některé strategie ladění:
- Spusťte
sp_who
nebosp_who2
. Tyto systémové uložené procedury vracejí informace zesysprocesses
systémovou tabulku, která zobrazuje stav a informace o všech pracovních procesech. Obecně uvidíte jedno ID procesu serveru (SPID) na připojení. Pokud jste připojení pojmenovali pomocí argumentu Název aplikace v řetězci připojení, bude snadné najít vaše fungující připojení. - Používejte SQL Server Profiler s SQLProfiler
TSQL_Replay
šablona pro sledování otevřených spojení. Pokud znáte Profiler, je tato metoda jednodušší než dotazování pomocí sp_who. - K monitorování fondů a připojení použijte nástroj Performance Monitor. Tuto metodu proberu za chvíli.
- Monitorujte čítače výkonu v kódu. Stav vašeho fondu připojení a počet navázaných připojení můžete sledovat pomocí rutin k extrakci čítačů nebo pomocí nových ovládacích prvků .NET PerformanceCounter.