2009-04-02 9 views
14

Ruft die using-Anweisung wirklich die close-Methode auf, wenn sie mit einem Datenbankverbindungsobjekt verwendet wird? The MSDN documentation sagt, es stellt sicher, dass die Dispose-Methode aufgerufen wird, aber nicht erwähnt, schließen. Ich sehe Beiträge auf Stack Overflow, wo Leute sagen, dass es beides tut. Hat jemand eine konkrete Antwort auf die eine oder andere Weise von Microsoft oder andere solide Beweise dafür?Verwenden von Anweisungen und Close-Methoden

Antwort

19

Hier ist die "Entsorgen" Methode der SqlConnection Klasse:

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     this._userConnectionOptions = null; 
     this._poolGroup = null; 
     this.Close(); 
    } 
    this.DisposeMe(disposing); 
    base.Dispose(disposing); 
} 

Wie man sehen kann, tut es in der Tat Anruf Close()

+0

Dies ist für SqlConnection-Objekt, was ist mit anderen Verbindungsobjekten? Ich meine SqlLiteConnection oder so weiter? Wie können wir sicher sein, dass sie innerhalb der Dispose-Methode Close() aufrufen? Ich weiß, dass die meisten Fälle identisch sind wie oben, aber ich denke, dass 1% immer noch übrig ist. –

2

Der Aufruf der Close Methode ruft Dispose auf. Es spielt keine Rolle, welcher genannt wird.

Ein konkretes Beispiel ist die FileStream.Close() Methode:

Diese Implementierung von Close ruft die Dispose-Methode einen wahren Wert übergeben.

1

Jede Klasse kann, wenn sie eine Dispose-Methode hat implementiert die IDisposable-Schnittstelle.

MSDN sagt: "Die primäre Verwendung dieser Schnittstelle besteht darin, nicht verwaltete Ressourcen freizugeben."

Es ist dem Implementierer überlassen zu entscheiden, was genau das bedeutet.

Im Fall einer DBConnection bedeutet Entsorgung auch Verbindung zu schließen ...

+0

Es wird also angenommen, dass wer auch immer IDisposable implementiert, intern intern die Dispose-Methode aufrufen wird, richtig? Das scheint etwas subjektiv ... – James

0

schließen und entsorgen das gleiche tun. Sie haben Close nur zur besseren Lesbarkeit hinzugefügt, um zu sagen, dass Sie "die Verbindung geschlossen haben" natürlicher ist.

6

Wenn Sie eine using Anweisung die Verbindung verwenden, wird geschlossen, macht es keinen Sinn, dass ein Objekt, das IDisposable implementiert, wird offen bleiben, nachdem es Müll gesammelt ...

Aber Close() und Dispose() sind nicht die Gleiche Sache:

  • Dispose() ruft immer Close() implizit auf.
  • Dispose() die Connection löscht, tut Close() nicht.
  • Wenn Sie die Verbindung wieder öffnen wieder gehen, sollten Sie Close() nicht Dispose()

Und wenn Sie Dispose() verwenden Sie es nicht direcly nennen, die using Aussage, es ist der beste Weg, zu tun es.

1

Beachten Sie aber, dass alle Close() tut, ist Lösen der Verbindung zurück an den Verbindungspool. Sie werden weiterhin eine aktive Verbindung zu der Datenbank in SQL Server bemerken. Wenn Sie benötigen, um sicherzustellen, dass dies auch geschlossen ist, möchten Sie vielleicht ClearAllPools oder ClearPool

Von MSDN Verbindungspooling die Anzahl der berücksichtigen reduziert, die neue Verbindungen geöffnet werden müssen.Der Pooler behält die Eigentümerschaft der physischen Verbindung bei. Es verwaltet Verbindungen, indem es eine Reihe aktiver Verbindungen für jede gegebene Verbindungskonfiguration aufrecht erhält. Wenn ein Benutzer bei einer Verbindung den Befehl "Öffnen" aufruft, sucht der Pooler nach einer verfügbaren Verbindung im Pool. Wenn eine gepoolte Verbindung verfügbar ist, wird sie an den Aufrufer zurückgegeben, anstatt eine neue Verbindung zu öffnen. Wenn die Anwendung die Verbindung bei der Verbindung aufruft, gibt der Pooler sie an den Pool der aktiven Verbindungen zurück, anstatt sie tatsächlich zu schließen. Sobald die Verbindung zum Pool zurückgegeben wird, kann sie beim nächsten offenen Anruf erneut verwendet werden.

+0

+1 Gut zu wissen, kommt die Verbindung nach einer gewissen Inaktivitätszeit in den Pool zurück? – James

Verwandte Themen