In de meeste gevallen houden problemen met het poolen van verbindingen verband met verbindingslekken . Uw toepassing sluit de databaseverbindingen waarschijnlijk niet correct en consistent af. Wanneer u verbindingen open laat, blijven ze geblokkeerd totdat de .NET-vuilniscollector ze voor u sluit door hun Finalize()
aan te roepen. methode.
Je wilt zeker weten dat je de verbinding echt verbreekt . De volgende code veroorzaakt bijvoorbeeld een verbindingslek, als de code tussen .Open
en Close
gooit een uitzondering:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
De juiste manier zou zijn:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
of
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Wanneer uw functie een verbinding retourneert vanuit een klassenmethode zorg ervoor dat je het lokaal in de cache plaatst en roep het Close
. aan methode. Je lekt een verbinding door bijvoorbeeld deze code te gebruiken:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
De verbinding keerde terug van de eerste aanroep naar getConnection()
wordt niet gesloten. In plaats van uw verbinding te sluiten, maakt deze regel een nieuwe en probeert deze te sluiten.
Als u SqlDataReader
. gebruikt of een OleDbDataReader
, sluit ze. Ook al lijkt het sluiten van de verbinding zelf voldoende, doe extra moeite om uw gegevenslezer-objecten expliciet te sluiten wanneer u ze gebruikt.
Dit artikel "Waarom loopt een verbindingspool over?" van MSDN/SQL Magazine legt veel details uit en stelt enkele debuggingstrategieën voor:
- Voer
sp_who
uit ofsp_who2
. Deze door het systeem opgeslagen procedures retourneren informatie uit desysprocesses
systeemtabel die de status van en informatie over alle werkprocessen weergeeft. Over het algemeen ziet u één serverproces-ID (SPID) per verbinding. Als u uw verbinding een naam hebt gegeven met behulp van het Application Name-argument in de verbindingsreeks, zijn uw werkende verbindingen gemakkelijk te vinden. - Gebruik SQL Server Profiler met de SQLProfiler
TSQL_Replay
sjabloon om open verbindingen te traceren. Als je bekend bent met Profiler, is deze methode eenvoudiger dan pollen met sp_who. - Gebruik de Prestatiemeter om de pools en verbindingen te bewaken. Ik bespreek deze methode zo meteen.
- Bewaak prestatiemeteritems in code. U kunt de status van uw verbindingspool en het aantal tot stand gebrachte verbindingen controleren door routines te gebruiken om de tellers te extraheren of door de nieuwe .NET PerformanceCounter-besturingselementen te gebruiken.