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
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()
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.
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 ...
Es wird also angenommen, dass wer auch immer IDisposable implementiert, intern intern die Dispose-Methode aufrufen wird, richtig? Das scheint etwas subjektiv ... – James
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.
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 immerClose()
implizit auf.Dispose()
die Connection löscht, tutClose()
nicht.- Wenn Sie die Verbindung wieder öffnen wieder gehen, sollten Sie
Close()
nichtDispose()
Und wenn Sie Dispose()
verwenden Sie es nicht direcly nennen, die using
Aussage, es ist der beste Weg, zu tun es.
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.
+1 Gut zu wissen, kommt die Verbindung nach einer gewissen Inaktivitätszeit in den Pool zurück? – James
- 1. Android und SQLite: Wann Semikolons zum Beenden von Anweisungen verwenden?
- 2. Verwenden von Listen und Tupel in Python if Anweisungen
- 3. Vorbereitete Anweisungen von PHP für Postgres verwenden
- 4. Verwenden von OR-Vergleichen mit IF-Anweisungen
- 5. Verwenden von RegExp in IIS-Rewrite-Anweisungen
- 6. Verwenden mehrerer 'If' Anweisungen richtig?
- 7. Trace und Debug-Anweisungen
- 8. Verwenden vorbereiteter Anweisungen mit JDBCTemplate
- 9. Verwenden von if-Anweisungen in PHP zum Drucken von HTML
- 10. Verwenden von SQL-Anweisungen zum Abfragen von speicherinternen Objekten
- 11. Makros und IF-Anweisungen
- 12. Kombinieren von SET-Anweisungen mit normalen Anweisungen
- 13. Auswerten von Anweisungen mit viel && und || Bedingungen
- 14. if-Anweisungen und Platzierung von null Kontrollen
- 15. Anweisungen zum Einrichten von Fiddler und Bluestacks
- 16. Verwendung von für immer und immer Anweisungen
- 17. Wie deklarieren Sie Variablen und verwenden Sie Anweisungen in LINQPad?
- 18. Verwenden Sie Anweisungen und erwarten Schlüsselwörter spielen gut in C#
- 19. Welche CPU-Anweisungen verwenden die meiste Energie?
- 20. Promises und generische .catch() Anweisungen
- 21. if-Anweisungen und TextInput- Wert
- 22. Verwenden geschachtelter IIF-Anweisungen zum Subtrahieren von zwei Datenspalten
- 23. Verwenden von CASE-Anweisungen in der WHERE-Klausel
- 24. Verwenden von Regex zum Auswerten verschachtelter IF-Anweisungen
- 25. Vorbereitete Anweisungen und JDBC-Treiber
- 26. mysqli vorbereitete Anweisungen und mysqli_real_escape_string
- 27. Fehler beim Versuch, import.jxl ... Anweisungen zu verwenden
- 28. Verwenden von jQuery-Anweisungen in normalen JavaScript-Funktionen
- 29. Verwenden von execute()/executemany() für SQL-Anweisungen in Python
- 30. Wann sollte ich vorbereitete Anweisungen genau verwenden?
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. –