sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu vyřešit problém fondu připojení mezi ASP.NET a SQL Server?

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 nebo sp_who2 . Tyto systémové uložené procedury vracejí informace ze sysprocesses 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.


  1. Neo4j - Vytvořte uzel pomocí Cypher

  2. Jak vytvořit databázový model od nuly

  3. Jak mohu potlačit výstup záhlaví sloupců pro jeden příkaz SQL?

  4. Začínáme s Shareplexem ve Windows na AWS, část 1