sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg løse et forbindelsespuljeproblem mellem ASP.NET og SQL Server?

I de fleste tilfælde er problemer med forbindelsespooling relateret til forbindelseslækager . Din applikation lukker sandsynligvis ikke sine databaseforbindelser korrekt og konsekvent. Når du lader forbindelser være åbne, forbliver de blokerede, indtil .NET-skraldsamleren lukker dem for dig ved at kalde deres Finalize() metode.

Du vil sikre dig, at du virkelig lukker forbindelsen . For eksempel vil følgende kode forårsage en forbindelseslækage, hvis koden mellem .Open og Close kaster en undtagelse:

var connection = new SqlConnection(connectionString);

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

Den korrekte måde ville være denne:

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 returnerer en forbindelse fra en klassemetode sørg for at cache den lokalt og kalde dens Close metode. Du vil lække en forbindelse ved at bruge denne kode for eksempel:

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

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

Forbindelsen vendte tilbage fra det første kald til getConnection() bliver ikke lukket. I stedet for at lukke din forbindelse, opretter denne linje en ny og forsøger at lukke den.

Hvis du bruger SqlDataReader eller en OleDbDataReader , luk dem. Selvom det lader til at lukke forbindelsen i sig selv, skal du gøre en ekstra indsats for at lukke dine datalæserobjekter eksplicit, når du bruger dem.

Denne artikel "Hvorfor løber en forbindelsespool over?" fra MSDN/SQL Magazine forklarer en masse detaljer og foreslår nogle fejlfindingsstrategier:

  • Kør sp_who eller sp_who2 . Disse systemlagrede procedurer returnerer information fra sysprocesses systemtabel, der viser status for og information om alle arbejdsprocesser. Generelt vil du se ét serverproces-id (SPID) pr. forbindelse. Hvis du navngav din forbindelse ved at bruge argumentet Application Name i forbindelsesstrengen, vil dine arbejdsforbindelser være nemme at finde.
  • Brug SQL Server Profiler med SQLProfiler TSQL_Replay skabelon til at spore åbne forbindelser. Hvis du er bekendt med Profiler, er denne metode nemmere end polling ved at bruge sp_who.
  • Brug Performance Monitor til at overvåge pools og forbindelser. Jeg diskuterer denne metode om et øjeblik.
  • Overvåg ydeevnetællere i kode. Du kan overvåge tilstanden af ​​din forbindelsespulje og antallet af etablerede forbindelser ved at bruge rutiner til at udtrække tællerne eller ved at bruge de nye .NET PerformanceCounter-kontroller.


  1. GROUP BY i Postgres - ingen lighed for JSON-datatypen?

  2. Sådan genereres FRD-sporing i Oracle Apps 11i/R12

  3. FORALL erklæring med INDICES-OF bundet klausul i Oracle-databasen

  4. Benchmarking databaser 101 - del 1