In den meisten Fällen hängen Verbindungspooling-Probleme mit "Verbindungslecks" zusammen. Ihre Anwendung schließt ihre Datenbankverbindungen wahrscheinlich nicht korrekt und konsistent. Wenn Sie Verbindungen offen lassen, bleiben sie blockiert, bis der .NET-Garbage Collector sie für Sie schließt, indem Sie ihre Finalize()
Methode aufrufen .
Sie möchten sicherstellen, dass Sie die Verbindung wirklich schließen . Der folgende Code verursacht beispielsweise ein Verbindungsleck, wenn der Code zwischen .Open
und Close
eine Ausnahme auslöst:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Der richtige Weg wäre folgender:
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 sie lokal zwischenspeichern und ihre Close
Methode aufrufen . Mit diesem Code wird beispielsweise eine Verbindung unterbrochen:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
Die vom ersten Anruf an zurückgegebene Verbindung getConnection()
wird nicht geschlossen. Anstatt Ihre Verbindung zu schließen, erstellt diese Zeile eine neue und versucht, sie zu schließen.
Wenn Sie SqlDataReader
oder a verwenden OleDbDataReader
, schließen Sie sie. Auch wenn das Schließen der Verbindung selbst den Trick zu tun scheint, sollten Sie zusätzliche Anstrengungen unternehmen, um Ihre Datenleserobjekte explizit zu schließen, wenn Sie sie verwenden.
Dieser Artikel " Warum läuft ein Verbindungspool über? " Aus dem MSDN / SQL-Magazin erläutert viele Details und schlägt einige Debugging-Strategien vor:
- Führen Sie
sp_who
oder sp_who2
. Diese gespeicherten Systemprozeduren geben Informationen aus der sysprocesses
Systemtabelle zurück, die den Status und Informationen zu allen Arbeitsprozessen anzeigen. Im Allgemeinen wird pro Verbindung eine Serverprozess-ID (SPID) angezeigt. Wenn Sie Ihre Verbindung mit dem Argument Anwendungsname in der Verbindungszeichenfolge benannt haben, sind Ihre Arbeitsverbindungen leicht zu finden.
- Verwenden Sie SQL Server Profiler mit der SQLProfiler-
TSQL_Replay
Vorlage, um offene Verbindungen zu verfolgen. Wenn Sie mit Profiler vertraut sind, ist diese Methode einfacher als das Abrufen mit sp_who.
- Verwenden Sie den Leistungsmonitor, um die Pools und Verbindungen zu überwachen. Ich diskutiere diese Methode gleich.
- Überwachen Sie die Leistungsindikatoren im Code. Sie können den Zustand Ihres Verbindungspools und die Anzahl der hergestellten Verbindungen überwachen, indem Sie Routinen zum Extrahieren der Zähler oder die neuen .NET PerformanceCounter-Steuerelemente verwenden.