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
ellersp_who2
. Dessa systemlagrade procedurer returnerar information frånsysprocesses
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.