3

Stellen Sie sich eine ASP.NET-Anwendung mit einem Speicherverlustproblem im Verbindungspool vor (wo zum Beispiel Verbindungen nicht ordnungsgemäß geschlossen werden).IIS-Anwendungspool und .NET-Garbage Collection

Wird der Verbindungspool durch das Recyceln des Anwendungspools gelöscht (wodurch mehr Verbindungen hergestellt werden können)?

Wenn die Verbindungen so lange im Speicher verbleiben, bis der Garbage Collector sie entfernt, geschieht dies, wenn der Anwendungspool neu gestartet wird (oder bleibt/bleibt)? Ich verstehe auch, dass der Garbage Collector sie jederzeit bereinigen kann, aber sind sie immer noch in Verwendung und können nicht gesammelt werden, bis ein Reset oder ein Anwendungspool neu gestartet wird?

Ich überprüfe ein System, bei dem das Endziel offensichtlich darin besteht, den Code korrigieren zu lassen, um die Verbindungen korrekt zu verwalten, und ich versuche mehr Verständnis für den Garbage-Collection-/Application-Pool-Prozess zu erlangen.

Antwort

5

Ja, wenn Sie den App-Pool recyceln, wird der IIS-Prozess, der für die Ausführung Ihrer Anwendung verantwortlich ist, beendet und neu gestartet. Alle Ressourcen werden an diesem Punkt freigegeben, einfach weil der Prozess beendet wird.

Wenn der Prozess nie neu gestartet wird und einfach die Griffe ausgibt, wird der Garbage Collector sie schließlich bereinigen. Es ist jedoch wahrscheinlich, dass Sie keine Handles mehr für die Ressource haben, die ausläuft, bevor dies geschieht. Aus diesem Grund ist es wichtig, Dispose() für diese Objekte aufzurufen (vorzugsweise über das "using" -Muster), damit die Ressourcen freigegeben werden, sobald die App fertig ist und nicht, wenn der Garbage Collector dazu kommt.

1

Ein Verbindungspool ist ein Cache für Datenbankverbindungen. Ein Anwendungspool ist ein (oder mehrere) Worker-Prozesse. Wenn Sie also den Anwendungspool herunterfahren, schließen Sie Ihre Arbeitsprozesse und starten neue Arbeitsprozesse. Dies führt dazu, dass der Pool zerstört wird und alle Verbindungen im Verbindungspool geschlossen werden.

Wenn Sie bei einer Verbindung weder "Schließen" noch "Dispose" aufrufen und sich auf den Garbage Collector verlassen, wird die Verbindung möglicherweise nicht an den Pool zurückgegeben. Ich denke, es wird nur wieder zum Pool hinzugefügt, wenn die Verbindung noch gültig ist und die maximale Poolgröße erreicht wurde. Wie Sie wahrscheinlich wissen, sollten Sie sich niemals auf den Garbage Collector verlassen. Eine einfache Möglichkeit, die Verbindung sicherzustellen, besteht darin, die Anweisung using zu verwenden, die am Ende des Codeblocks automatisch Dispose aufruft.

In ADO.NET 2.0 gibt es neue Methoden zum programmatischen Verwalten der Pools: ClearAllPools und ClearPool. Dies kann Ihnen bei Ihrem Problem helfen, bis Sie den gesamten Datenzugriffscode reparieren können.

+0

Glück für mich, ich werde nicht derjenige sein, der die Fixierung tun muss! das eigentliche Problem ist die übermäßige Verwendung von Datenreadern in der Anwendung ... es gibt keine try/catch/finally-Blöcke, wenn also ein Fehler auftritt, wenn der dispose-Code nie ausgeführt wird und die Verbindungen aufgebraucht sind ... – davidsleeps

+0

So klang es ... es ist lustig/traurig, wie sich die gleichen Fehler immer wieder zeigen. –