In den letzten Tagen sehen wir diese Fehlermeldung auf unserer Website zu oft:
"Zeitüberschreitung abgelaufen. Die Zeitüberschreitung vor dem Abrufen einer Verbindung aus dem Pool ist abgelaufen. Dies kann aufgetreten sein, weil alle Poolverbindungen verwendet wurden und die maximale Poolgröße erreicht wurde."
Wir haben seit einiger Zeit nichts an unserem Code geändert. Ich habe den Code überarbeitet, um offene Verbindungen zu überprüfen, die nicht geschlossen wurden, aber alles in Ordnung fand.
Wie kann ich das lösen?
Muss ich diesen Pool bearbeiten?
Wie kann ich die maximale Anzahl von Verbindungen dieses Pools bearbeiten?
Was ist der empfohlene Wert für eine stark frequentierte Website?
Aktualisieren:
Muss ich etwas in IIS bearbeiten?
Aktualisieren:
Ich habe festgestellt, dass die Anzahl der aktiven Verbindungen zwischen 15 und 31 liegt, und ich habe festgestellt, dass die maximal zulässige Anzahl der in SQL Server konfigurierten Verbindungen mehr als 3200 Verbindungen beträgt, 31 zu viele sind oder ich etwas in der ASP.NET-Konfiguration bearbeiten sollte ?
quelle
Antworten:
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
undClose
eine Ausnahme auslöst:Der richtige Weg wäre folgender:
oder
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: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 verwendenOleDbDataReader
, 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:
sp_who
odersp_who2
. Diese gespeicherten Systemprozeduren geben Informationen aus dersysprocesses
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.TSQL_Replay
Vorlage, um offene Verbindungen zu verfolgen. Wenn Sie mit Profiler vertraut sind, ist diese Methode einfacher als das Abrufen mit sp_who.quelle
Bei der Installation von .NET Framework v4.6.1 begannen unsere Verbindungen zu einer entfernten Datenbank aufgrund dieser Änderung sofort eine Zeitüberschreitung .
Um dies zu beheben, fügen Sie einfach den Parameter
TransparentNetworkIPResolution
in die Verbindungszeichenfolge ein und setzen Sie ihn auf false :quelle
Wenn Ihre Nutzung nicht stark gestiegen ist, ist es unwahrscheinlich, dass nur ein Arbeitsstau vorliegt. IMO, die wahrscheinlichste Option ist, dass etwas Verbindungen verwendet und diese nicht sofort freigibt. Sind Sie sicher, dass Sie
using
in allen Fällen verwenden? Oder (durch welchen Mechanismus auch immer) die Verbindungen lösen?quelle
Haben Sie vor dem Schließen der Verbindung oder eines Datenarders nach nicht geschlossenen DataReadern und response.redirects gesucht? Verbindungen bleiben geöffnet, wenn Sie sie vor einer Umleitung nicht schließen.
quelle
Dieses Problem tritt von Zeit zu Zeit auch auf unserer Website auf. Der Schuldige in unserem Fall ist, dass unsere Statistiken / Indizes nicht mehr aktuell sind. Dies führt dazu, dass eine zuvor schnell laufende Abfrage (irgendwann) langsam wird und eine Zeitüberschreitung auftritt.
Versuchen Sie, Statistiken zu aktualisieren und / oder die Indizes für die von der Abfrage betroffenen Tabellen neu zu erstellen, und prüfen Sie, ob dies hilfreich ist.
quelle
Sie können die minimale und maximale Poolgröße angeben, indem Sie
MinPoolSize=xyz
und / oderMaxPoolSize=xyz
in der Verbindungszeichenfolge angeben . Diese Ursache des Problems könnte jedoch eine andere sein.quelle
Dieses Problem ist auch bei der Verwendung einer Datenschicht eines Drittanbieters in einer meiner .NET-Anwendungen aufgetreten. Das Problem war, dass die Schicht die Verbindungen nicht richtig schloss.
Wir haben die Schicht weggeworfen und selbst eine erstellt, die die Verbindungen immer schließt und entsorgt. Seitdem bekommen wir den Fehler nicht mehr.
quelle
Sie können dies auch versuchen, um das Timeout-Problem zu lösen:
Wenn Sie Ihrer Webkonfiguration keine httpRuntime hinzugefügt haben, fügen Sie diese im
<system.web>
Tag hinzuund
Ändern Sie Ihre Verbindungszeichenfolge wie folgt.
Endlich benutzen
quelle
Dies liegt hauptsächlich daran, dass die Verbindung in der Anwendung nicht geschlossen wurde. Verwenden Sie "MinPoolSize" und "MaxPoolSize" in der Verbindungszeichenfolge.
quelle
In meinem Fall habe ich das DataReader-Objekt nicht geschlossen.
quelle
Wenn Sie an komplexem Legacy-Code arbeiten, bei dem eine einfache Verwendung von (..) {..} nicht möglich ist - wie ich -, sollten Sie das Code-Snippet, das ich in dieser SO-Frage gepostet habe, überprüfen, um eine Möglichkeit zu finden, das zu bestimmen Aufrufstapel der Verbindungserstellung, wenn eine Verbindung möglicherweise durchgesickert ist (nach einem festgelegten Zeitlimit nicht geschlossen). Dies macht es ziemlich einfach, die Ursache der Lecks zu erkennen.
quelle
Instanziieren Sie die SQL-Verbindung nicht zu oft. Öffnen Sie eine oder zwei Verbindungen und verwenden Sie sie für alle nächsten SQL-Vorgänge.
Scheint, dass selbst beim
Dispose
Herstellen der Verbindungen die Ausnahme ausgelöst wird.quelle
Neben den veröffentlichten Lösungen ....
Im Umgang mit 1000 Seiten Legacy-Code, die jeweils mehrmals ein gemeinsames GetRS aufrufen, können Sie das Problem auf folgende Weise beheben:
In einer vorhandenen gemeinsamen DLL haben wir die Option CommandBehavior.CloseConnection hinzugefügt :
Solange Sie den Datenleser schließen, wird auf jeder Seite die Verbindung automatisch geschlossen, um Verbindungslecks zu vermeiden.
quelle
Ich hatte gerade das gleiche Problem und wollte mitteilen, was mir beim Auffinden der Quelle geholfen hat: Fügen Sie den Anwendungsnamen zu Ihrer Verbindungszeichenfolge hinzu und überwachen Sie dann die offene Verbindung zum SQL Server
quelle
Dieses Problem hatte ich in meinem Code. Ich werde einen Beispielcode einfügen, den ich über den Fehler gebracht habe. Die Zeitüberschreitung verstrichen, bevor eine Verbindung aus dem Pool hergestellt wurde. Dies kann aufgetreten sein, weil alle Poolverbindungen verwendet wurden und die maximale Poolgröße erreicht wurde.
Sie möchten die Verbindung jedes Mal schließen. Vorher habe ich uns nicht die enge Verbindung gemacht, deshalb habe ich einen Fehler bekommen. Nach dem Hinzufügen von close Anweisung bin ich über diesen Fehler gekommen
quelle
Sie haben Verbindungen in Ihrem Code durchgesickert. Sie können versuchen, mithilfe von zu bestätigen, dass Sie sie schließen.
https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pooling-and-the-timeout-expired-exception-faq/
quelle
Dieses Problem habe ich schon einmal angetroffen. Es war schließlich ein Problem mit der Firewall. Ich habe der Firewall gerade eine Regel hinzugefügt. Ich musste den Port öffnen,
1433
damit der SQL Server eine Verbindung zum Server herstellen kann.quelle
Benutze das:
quelle
SqlConnection.ClearPool
, aber verhindert das nur, dass Ihre aktuelle Verbindung wieder in den Verbindungspool freigegeben wird? Ich dachte, die Idee des Verbindungspools wäre, schnellere Verbindungen zu ermöglichen. Wenn Sie die Verbindung sicher jedes Mal aus dem Pool freigeben, wenn sie beendet ist, muss JEDES MAL eine NEUE Verbindung erstellt werden, anstatt eine Ersatzverbindung aus dem Pool zu ziehen? Bitte erläutern Sie, wie und warum diese Technik nützlich ist.Ja, es gibt eine Möglichkeit, die Konfiguration zu ändern. Wenn Sie sich auf einem dedizierten Server befinden und einfach mehr SQL-Verbindungen benötigen, können Sie die Einträge "Maximale Poolgröße" in beiden Verbindungszeichenfolgen mithilfe der folgenden Anweisungen aktualisieren:
Suchen Sie Ihre Verbindungszeichenfolgen. Diese sehen in den folgenden Beispielen ähnlich aus:
"add name =" SiteSqlServer "connectionString =" server = (local); database = dbname; uid = dbuser; pwd = dbpassword; pooling = true; Verbindungslebensdauer = 120; maximale Poolgröße = 25; ""
5.Ändern Sie den Wert für die maximale Poolgröße = X an die erforderliche Poolgröße.
quelle
Stellen Sie sicher, dass Sie die richtigen Einstellungen für den Verbindungspool vorgenommen haben. Dies ist sehr wichtig, wie ich im folgenden Artikel erklärt habe: https://medium.com/@dewanwaqas/configurations-that-significant-verbessert-Ihre-app-performance-built-using-sql-server-and-net- ed044e53b60 Sie werden eine drastische Verbesserung der Leistung Ihrer Anwendung feststellen, wenn Sie diese befolgen.
quelle
In meinem Fall hatte ich eine Endlosschleife (von einer get-Eigenschaft, die versucht, einen Wert aus der Datenbank abzurufen), die immer wieder Hunderte von SQL-Verbindungen öffnete.
Um das Problem zu reproduzieren, versuchen Sie Folgendes:
quelle