2009-06-26 5 views
4

Major Edit: Ich habe den Artikel falsch gelesen! Der Kommentar war in Bezug auf die Finalize-Methode der Klasse nicht der Endblock :). Entschuldigung.Warum nicht schließen Sie eine Datenbankverbindung in einem endgültigen Block

Ich habe gerade gelesen, dass Sie eine Datenbankverbindung in einem finally Block nicht schließen oder entsorgen sollten, aber der Artikel hat nicht erklärt warum. Ich kann keine klare Erklärung dafür finden, warum Sie das nicht tun wollen.

Here is the article

+1

Können Sie zum Original-Artikel Link zurück –

+0

Ich denke, Sie sollten den Artikel der Verbindung setzen, wenn er online ist –

+0

Klingt wie eine gefälschte Artikel ... – womp

Antwort

13

Wenn man sich umschaut, ist die Verbindung im finally-Block schließt eine der empfohlenen Wege, es zu tun. Der Artikel, den Sie angeschaut haben, hat wahrscheinlich empfohlen, eine 'using'-Anweisung um den Code zu verwenden, der die Verbindung verwendet hat.

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    SqlCommand command = connection.CreateCommand(); 

    command.CommandText = "select * from someTable"; 

    // Execute the query here...put it in a datatable/dataset 
} 

Die ‚mit‘ Erklärung wird das Connection-Objekt sicherzustellen, wird sofort entsorgt, nachdem es eher gebraucht wird für den Garbage Collector als warten darüber zu verfügen.

+1

... und eine using-Anweisung ist nur eine syntaktische Abkürzung für einen Versuch-endlich. – Richard

+1

Es ist nicht nur eine Abkürzung. Ein try-finally-Block wird das Objekt nach dem try-finally-Block nicht entfernen, bis der Garbage Collector seine Magie entfaltet. Die using-Anweisung wird sofort den Block vervollständigen. –

+0

Dies würde SqlConnection Verbindung; versuchen Sie { Verbindung = neue SqlConnection (connectionString); Verbindung.Öffnen(); } schließlich { connection.Dispose(); } –

4

Ich bin anderer Meinung, dass Sie eine Datenbankverbindung innerhalb eines finally-Blocks nicht schließen oder entsorgen sollten.

Wenn Sie eine nicht behandelte (oder sogar gehandhabte) Ausnahme zulassen, lassen Sie offene Verbindungen eine Datenbank ziemlich schnell entfernen, wenn sie sehr aktiv ist.

Das Schließen einer Datenbankverbindung ist das defacto Beispiel für die Verwendung der finally-Anweisung IMHO. Natürlich ist die using-Anweisung meine bevorzugte Methode, was vielleicht der ursprüngliche Autor war.

Bearbeiten zum Haupt Bearbeiten: Das macht jetzt Sinn. Sie möchten nicht die Datenbankverbindung zum Garbage Collector schließen.

3

Ohne den Originalartikel kann ich nicht für den Autor sprechen. Je nachdem, wie Sie die Instanziierung und das Öffnen der Verbindung in Bezug auf den Block "try/catch/finally" implementiert haben, müssen Sie möglicherweise zusätzliche Prüfungen vornehmen, bevor Sie nur auf "Schließen" klicken. Stellen Sie sicher, dass die Verbindung nicht null ist und nicht bereits geschlossen ist.

EDIT: Der Artikel sagt, ein Verbindungsobjekt in Ihrer Finalize-Methode nicht zu beseitigen, um es nicht im finally-Block zu schließen. Im obigen Absatz heißt es, dass Sie Ihre Verbindung immer schließen sollten, nachdem Sie sie verwendet haben, sodass sie in den Verbindungspool zurückgegeben wird.

"VORSICHT Es wird empfohlen, dass Sie die Verbindung immer schließen, wenn Sie sie nicht mehr benötigen, um die Verbindung zum Pool wiederherzustellen. Dies kann mit den Methoden Close oder Dispose des Connection-Objekts erfolgen B. nicht ausdrücklich geschlossen, werden möglicherweise nicht hinzugefügt oder an den Pool zurückgegeben.Eine Verbindung, die den Gültigkeitsbereich verlassen hat, aber nicht explizit geschlossen wurde, wird nur dann an den Verbindungspool zurückgegeben, wenn die maximale Poolgröße erreicht wurde und Die Verbindung ist weiterhin gültig

Hinweis: Rufen Sie in der Finalize-Methode Ihrer Klasse weder Close noch Dispose für eine Verbindung, einen DataReader oder ein anderes verwaltetes Objekt auf, sondern geben Sie in einem Finalizer nur nicht verwaltete Ressourcen frei, die der Klasse direkt gehören . Wenn dein Klasse besitzt keine nicht verwalteten Ressourcen. Fügen Sie keine Finalize-Methode in Ihre Klassendefinition ein.Weitere Informationen "

http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx?ppud=4

2

Ein bisschen Googlen taucht ziemlich viele Seiten, die die oppositeopinion halten. Mit einem‚endlich‘scheint Block wie ein guter Weg, um sicherzustellen, dass die Verbindung immer geschlossen ist richtig, obwohl, wie andere gesagt haben, würde mich interessieren, den ursprünglichen Artikel zu sehen, dass es keine gute Idee war.

2

Von dem, was ich in dem Artikel sehen kann, rät es Ratschläge gegen Dispose oder Close in der Finalizer einer Klasse, nicht dagegen in einem Block, das ist eine ganz andere Sache.

0

Die Methode Close versetzt das Verbindungsobjekt in einen Zustand, aus dem es wieder geöffnet werden kann. Die Methode Dispose versetzt sie in einen Zustand, aus dem sie nicht wieder geöffnet werden kann (indem sie zuerst geschlossen wird, wenn sie gerade geöffnet ist).

Wenn Sie eine Verbindung instanziieren, öffnen, verwenden und dann wegwerfen (das normale Verwendungsmuster), dann ist ein using Block der beste und einfachste Weg, dies zu tun.

Offensichtlich, wenn Sie etwas komplexer mit mehreren Open und Close Aufrufe tun, dann wird die Entsorgung es einen Schraubenschlüssel in die Arbeit werfen.

Verwandte Themen