sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik een verbindingspoolprobleem tussen ASP.NET en SQL Server oplossen?

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 of sp_who2 . Deze door het systeem opgeslagen procedures retourneren informatie uit de sysprocesses 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.


  1. Geen ondersteuning voor OVER in MS SQL Server 2005?

  2. ClusterControl - Geavanceerd back-upbeheer - mariabackup deel II

  3. Een gegevensmodel voor de bezorging van boodschappen

  4. Datum- en tijdnotaties wijzigen in MySQL