In den meisten Fällen hängen Probleme mit dem Pooling von Verbindungen zusammen mit Verbindungslecks . Ihre Anwendung schließt ihre Datenbankverbindungen wahrscheinlich nicht korrekt und konsequent. Wenn Sie Verbindungen offen lassen, bleiben sie blockiert, bis der .NET Garbage Collector sie für Sie schließt, indem er ihre Finalize()
Methode.
Sie möchten sicherstellen, dass Sie die Verbindung wirklich zu schließen . Der folgende Code verursacht beispielsweise ein Verbindungsleck, wenn der Code zwischen .Open
y Close
eine Ausnahme auslöst:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Der richtige Weg wäre der folgende:
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 gibt eine Verbindung aus einer Klassenmethode zurück stellen Sie sicher, dass Sie sie lokal zwischenspeichern und ihre Close
Methode. Mit diesem Code können Sie zum Beispiel eine Verbindung unterbrechen:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
Die Verbindung, die beim ersten Aufruf von 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 eine OleDbDataReader
schließen Sie sie. Auch wenn das Schließen der Verbindung selbst zu funktionieren 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? " aus dem MSDN/SQL Magazine erklärt viele Details und schlägt einige Debugging-Strategien vor:
- Exécuter
sp_who
o sp_who2
. Diese gespeicherten Systemprozeduren geben Informationen aus dem sysprocesses
Systemtabelle, die den Status und Informationen über alle Arbeitsprozesse anzeigt. Im Allgemeinen sehen Sie eine Server-Prozess-ID (SPID) pro Verbindung. Wenn Sie Ihre Verbindung mit dem Argument Anwendungsname in der Verbindungszeichenfolge benannt haben, sind Ihre funktionierenden Verbindungen leicht zu finden.
- Verwendung des SQL Server Profiler mit dem SQLProfiler
TSQL_Replay
Vorlage, um offene Verbindungen zu verfolgen. Wenn Sie mit Profiler vertraut sind, ist diese Methode einfacher als das Polling mit sp_who.
- Verwenden Sie den Performance Monitor, um die Pools und Verbindungen zu überwachen. Auf diese Methode werde ich gleich noch eingehen.
- Leistungszähler 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 oder die neuen .NET PerformanceCounter-Steuerelemente verwenden.