Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich ein Verbindungspoolproblem zwischen ASP.NET und SQL Server lösen?

In den meisten Fällen hängen Verbindungs-Pooling-Probleme mit Verbindungslecks zusammen . Ihre Anwendung schließt wahrscheinlich ihre Datenbankverbindungen nicht korrekt und konsistent. Wenn Sie Verbindungen offen lassen, bleiben sie blockiert, bis der .NET-Garbage Collector sie für Sie schließt, indem er ihr Finalize() aufruft Methode.

Sie sollten sicherstellen, dass Sie wirklich die Verbindung schließen . Beispielsweise verursacht der folgende Code ein Verbindungsleck, wenn der Code zwischen .Open und Close löst eine Ausnahme aus:

var connection = new SqlConnection(connectionString);

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

Der richtige Weg wäre dieser:

var connection = new SqlConnection(ConnectionString);

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

oder

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

Wenn Ihre Funktion eine Verbindung von einer Klassenmethode zurückgibt Stellen Sie sicher, dass Sie es lokal cachen und rufen Sie es Close auf Methode. Sie werden eine Verbindung beispielsweise mit diesem Code lecken:

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

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

Die vom ersten Aufruf von getConnection() zurückgegebene Verbindung wird nicht geschlossen. Anstatt Ihre Verbindung zu schließen, erstellt diese Zeile eine neue und versucht, sie zu schließen.

Wenn Sie SqlDataReader verwenden oder ein OleDbDataReader , schließen Sie sie. Auch wenn das Schließen der Verbindung selbst den Zweck zu erfüllen scheint, sollten Sie sich die Mühe machen, Ihre Datenleseobjekte explizit zu schließen, wenn Sie sie verwenden.

Dieser Artikel "Warum läuft ein Verbindungspool über?" vom MSDN/SQL Magazine erklärt viele Details und schlägt einige Debugging-Strategien vor:

  • Führen Sie sp_who aus oder sp_who2 . Diese gespeicherten Systemprozeduren geben Informationen von den sysprocesses zurück Systemtabelle, die Status und Informationen zu allen Arbeitsprozessen anzeigt. Im Allgemeinen sehen Sie eine Serverprozess-ID (SPID) pro Verbindung. Wenn Sie Ihre Verbindung mit dem Anwendungsnamen-Argument in der Verbindungszeichenfolge benannt haben, sind Ihre funktionierenden Verbindungen leicht zu finden.
  • Verwenden Sie SQL Server Profiler mit dem SQLProfiler TSQL_Replay Vorlage zum Verfolgen offener Verbindungen. Wenn Sie mit Profiler vertraut sind, ist diese Methode einfacher als das Abfragen mit sp_who.
  • Verwenden Sie den Performance Monitor, um die Pools und Verbindungen zu überwachen. Ich werde diese Methode gleich besprechen.
  • Leistungsindikatoren im Code überwachen. Sie können den Zustand Ihres Verbindungspools und die Anzahl der hergestellten Verbindungen überwachen, indem Sie Routinen zum Extrahieren der Zähler verwenden oder die neuen .NET PerformanceCounter-Steuerelemente verwenden.