Immer eine neue Verbindung aus dem connection pool Zeiten in ASP.Net Anwendung.Ich brauche Vorschläge für den Klimaschutz

StackOverflow https://stackoverflow.com/questions/1210090

Frage

Wir sind immer folgende Fehler auf eine bestimmte Datenbank gelegentlich unter mäßiger Last.

"System.InvalidOperationException:Timeout ist abgelaufen.Das Zeitlimit wurde vor dem anfordern einer Verbindung aus dem pool.Dies kann aufgetreten sein, weil alle gepoolten verbindungen verwendet wurden und die max-pool-Größe erreicht wurde."


Ich kämmte durch den code und schließen wir die verbindungen in finally-Blöcken, wie wir sollten, außer in einigen Fällen, in denen wir festgestellt haben, sind aufgerufen, sehr selten.Wir beheben diese code-Stücken, die im nächsten release zu lösen, die aktuelle Produktion Problem, ich schlage vor, erhöht die max-pool-Größe auf 300.Die max gleichzeitige Benutzer, die wir derzeit erleben, ist rund 110, die offensichtlich über die Standard-pool-Größe (100).

Ich bin auch darauf hindeutet, dass alle unsere Verbindungszeichenfolgen zu einer bestimmten SQL Server-Instanz identisch sind, um zu vermeiden, mehrere verbindungspools unnötig.Ich hoffe, wir können das USE [Database] Anweisung vor unserer eigentlichen SQL-Abfragen, wenn wir Sie wechseln müssen-Datenbanken in einer einzigen SQL Server-Instanz.

Habt Ihr irgendwelche Ideen, Hinweise, Anregungen oder Hinweise für uns zu beachten?

War es hilfreich?

Lösung

Sie müssen beseitigen Sie die undichte Verbindung.Wenn die Ursache des Poolspeichers wird leaks, Erhöhung auf 300 ist nur gonna das unvermeidliche hinauszuzögern.Wenn Sie ein Leck in Verbindung 10000 Anrufe (ie."sehr selten") und Sie haben 110 gleichzeitige Anfragen zu, sagen wir, 5 Sekunden einen Anruf, Sie lecken, mit einer rate von etwa einer Verbindung alle 8 Minuten, die wird entwässern Sie den pool in 13 Stunden.Die timeouts zu starten zeigt sich viel früher, aber, wie die zur Verfügung stehenden pool-Größe zu schrumpfen.

Wenn Sie harte Beweise, dass s nicht die Lecks, die die eigentliche Ursache aber in der Tat ist die rate der Anrufe vs.pool-Größe, dann sollten Sie erhöhen Sie die Größe des Pools.Was auch immer Ihre pool-Größe Sie sich entscheiden, zu verwenden, wenn Ihre Anforderungen sind, die 1:1 Verbindung für die gesamte Dauer der Anfragen, dann müssen Sie Gas/Warteschlange der HTTP akzeptiert, so dass Sie nicht mehr als Ihre pool-Größe.Wenn nicht, können Sie immer noch begegnen, spikes, Auspuff pool.

Auch Sie Mai erwägen Sie eine stabilere Verbindung Fabrik, eine, die Wiederholungen und versucht, eine nicht-gepoolte Verbindung, wenn der pool entleert.Natürlich geht dies hand in hand mit meiner vorherigen Punkt, dass, wenn Sie Kalibrieren, max-HTTP-accept-count to match the pool size, dann ist der pool kann nicht ausgeschöpft werden (es sei denn, Sie lecken, Sie zurück zu Platz eins).Ich würde das nicht empfehlen, obwohl, ich denke, das ist viel besser, queue-Anforderungen in der http.sys Territorium als das, in dem Anwendungs-Ressource-allocation-Territorium (ie.throttle max akzeptiert HTTP-Aufrufe).

Und das Letzte aber nicht mindestens, reduzieren Sie die Dauer von jedem Anruf.Wenn Ihr Anruf dauert im Durchschnitt 5 Sekunden, dann wirst du sehen, 110-Anschluss gleichzeitig auf nur einem bloßen 22-Anforderungen pro Sekunde.Wenn Sie reduzieren die Dauer des Anrufs durch den Wegfall SQL Engpässe zu 1 Sekunde, werden Sie in der Lage sein, um die service-110-Anfragen pro Sekunde zu schlagen, die gleiche Ressource cap (110 gleichzeitige Anforderungen), das ist ein 5-time traffic zu erhöhen.Der größte Schuldige ist in der Regel table-scans, stellen Sie sicher, dass alle Ihre Fragen sind mit sinnvollen SQL und haben einen optimalen Datenzugriff Weg.Wie David sagt, SQL Profiler ist dein Freund.

Sie können auch verwenden SqlConnection.ChangeDatabase um die Datenbank zu ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top