Ich finde immer widersprüchliche Ergebnisse für diese Frage. Sehen wir uns diesen C # -Code zum Ausführen einer SQL-Abfrage an:
%Vor% Muss ich das letzte cn.Close()
aufrufen? Der Grund, warum ich frage, ist, dass ich in einer Web-Anwendung mit starkem Verkehr keine Verbindungen mehr in einem Pool habe.
Das using
Schlüsselwort wie hier verwendet:
ist die Abkürzung für:
%Vor% cn.Dispose()
wird sofort aufgerufen, nachdem cn
den Gültigkeitsbereich von using
verlässt, was wiederum die Verbindung sofort beendet (weil SqlConnection.Dispose () genau das tut).
AKTUALISIEREN
Dies sollte nicht mit Garbage Collection verwechselt werden. GC ist in .NET nicht deterministisch, weshalb genau die IDisposable Schnittstelle und Dispose Pattern sind wurden vorgestellt. Mit IDisposable können teure Ressourcen zeitnah und deterministisch freigegeben werden.
Nicht erforderlich, um es zu schließen, wenn Sie using
verwenden, da es Displose()
intern aufruft.
Hier sind ein paar Details zu using
keyword in ADO.NET, die es sich zu lesen lohnt.
Nutzung des Schlüsselwortes "using" in C #
Eine schnelle Suche @SO führt Sie zu diesem Post , wo Sie können dort auch Ihre Antworten finden.
Sie müssen die Verbindung nicht schließen, wenn Sie die Using
-Anweisung verwenden.
Scott hanselman erklärt es hier Warum die Verwendung von Statement ist besser als ein scharfer Stick im Auge und ein SqlConnection Refactoring Beispiel .
In einer Web-Anwendung mit starkem Verkehr habe ich keine Verbindungen mehr in einem Pool.
Stellen Sie sicher, dass Sie die gleiche Verbindungszeichenfolge verwenden. Auf diese Weise verwendet SQL das Verbindungs-Pooling.
ist die Verbindung sofort geschlossen, oder ist es geschlossen, wenn der Müll Sammler kommt dazu
Bearbeiten:
Das Dispose-Muster wird verwendet, um Ressourcen deterministisch zu zerstören. Da der .net-Laufzeit-Garbage-Collector nicht deterministisch ist (was bedeutet, dass Sie nie sicher sein können, wann die Runtime alte Objekte sammeln und ihren Finalizer aufrufen wird). Wenn Sie das Dispose-Muster ordnungsgemäß implementieren, stellen Sie daher eine deterministische Freigabe der Ressourcen bereit, und in Fällen, in denen der Konsument unvorsichtig ist und das Objekt nicht verfügt, bereinigt der Finalizer das Objekt.
Tags und Links c# asp.net database-connection