sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag lösa ett anslutningspoolproblem mellan ASP.NET och SQL Server?

I de flesta fall är problem med anslutningspool relaterade till anslutningsläckor . Din applikation stänger förmodligen inte sina databasanslutningar korrekt och konsekvent. När du lämnar anslutningar öppna förblir de blockerade tills .NET garbage collector stänger dem åt dig genom att anropa deras Finalize() metod.

Du vill vara säker på att du verkligen stänger anslutningen . Till exempel kommer följande kod att orsaka en anslutningsläcka, om koden mellan .Open och Close ger ett undantag:

var connection = new SqlConnection(connectionString);

connection.Open();
// some code
connection.Close();                

Det korrekta sättet skulle vara detta:

var connection = new SqlConnection(ConnectionString);

try
{
     connection.Open();
     someCall (connection);
}
finally
{
     connection.Close();                
}

eller

using (SqlConnection connection = new SqlConnection(connectionString))
{
     connection.Open();
     someCall(connection);
}

När din funktion returerar en anslutning från en klassmetod se till att du cachelagrar den lokalt och anropar dess Close metod. Du kommer att läcka en anslutning med den här koden till exempel:

var command = new OleDbCommand(someUpdateQuery, getConnection());

result = command.ExecuteNonQuery();
connection().Close(); 

Anslutningen returnerades från det första anropet till getConnection() stängs inte. Istället för att stänga din anslutning skapar den här linjen en ny och försöker stänga den.

Om du använder SqlDataReader eller en OleDbDataReader , stäng dem. Även om det verkar göra susen att stänga anslutningen i sig, ansträng dig extra för att stänga dina dataläsarobjekt explicit när du använder dem.

Den här artikeln "Varför svämmar en anslutningspool över?" från MSDN/SQL Magazine förklarar många detaljer och föreslår några felsökningsstrategier:

  • Kör sp_who eller sp_who2 . Dessa systemlagrade procedurer returnerar information från sysprocesses systemtabell som visar status och information om alla arbetsprocesser. I allmänhet ser du ett serverprocess-ID (SPID) per anslutning. Om du namngav din anslutning genom att använda argumentet Application Name i anslutningssträngen, kommer dina fungerande anslutningar att vara lätta att hitta.
  • Använd SQL Server Profiler med SQLProfiler TSQL_Replay mall för att spåra öppna anslutningar. Om du är bekant med Profiler är den här metoden enklare än polling genom att använda sp_who.
  • Använd Performance Monitor för att övervaka poolerna och anslutningarna. Jag diskuterar den här metoden om ett ögonblick.
  • Övervaka prestandaräknare i kod. Du kan övervaka tillståndet för din anslutningspool och antalet etablerade anslutningar genom att använda rutiner för att extrahera räknarna eller genom att använda de nya .NET PerformanceCounter-kontrollerna.


  1. Benchmarking manuella databasdistributioner kontra automatiserade distributioner

  2. Oracle ORA-00979 - inte ett GROUP BY-uttryck

  3. Hur man förvandlar en json-array till rader i postgres

  4. Kan du lägga till ett if-uttalande i ORDER BY?