Was passiert mit einer unverschlossenen Datenbank-Verbindung?
-
06-07-2019 - |
Frage
Bereits heute Morgen habe ich einen Fehler in einem unserer Projekte gefunden - es gibt eine conenction mit Datenbank, die nie geschlossen ist, ich meine die Close () Methode nie aufgerufen. Allerdings, wenn ich die Anwendung zu schließen, wird die Verbindung geschlossen ist (überprüft in SQL Management Studio oft). Warum?
Lösung
Die Verbindung wird geschlossen, wenn die Anwendung beendet wird. Informieren Sie sich über SqlConnection Finalize . Von MSDN in der Dokumentation des Object.Finalize :
„Beim Herunterfahren eines Anwendungsdomäne wird Finalisierung automatisch auf Objekte aufgerufen, die nicht von der Finalisierung befreit werden, auch solche, die noch zugänglich sind.“
Andere Tipps
Eine andere Sache, hier im Auge zu behalten ist, dass in .Net, können Sie Ihre Verbindungen in einem mit Block wickeln kann, und das wird Ihre Verbindungen für Sie schließen und entsorgen. So das Fehlen eines expliziten Close () ist keine schlechte Sache, wenn Sie Ihre Verwendung von Blöcken dort haben ...
// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
conn.Open();
// database code here with no explicit close
}
das ist das funktionale Äquivalent eines try / finally mit einem conn.close im finally-Block. Viele Entwickler blicken auf die Verwendung von Blöcken - stellen Sie sicher, dass Sie nicht das gleiche in diesem Fall zu tun
.Wenn Sie Ihren Code neu schreiben Sie Ihre Verbindungen schließen - es gute Praxis ist Blöcke zu verwenden, verwendet um alles Ihre Datenbank-Objekte (Verbindung, Befehl, Leser), um sicherzustellen, dass sie schließen und entsorgen, wenn sie außerhalb des Bereichs fällt aus der unter Verwendung von Block. Ich würde auf jeden Fall diejenigen in Ihren Code, anstatt nur conn.Close (), wo nötig.
empfehlen, das SchreibenSQL-Verbindungen sind teuer zu erstellen und ADO.NET verwendet eine Technik, Connection Pooling genannt, die sie wiederverwendet werden können.
Zitat von MSDN :
Es wird dringend empfohlen, dass Sie schließen immer die Verbindung, wenn Sie indem sie fertig sind, so dass es an den Verbindungspool zurückgegeben werden und wiederverwendet werden.
Wenn die maximale Poolgröße wurde erreicht und keine brauchbare Verbindung ist verfügbar ist, wird die Anforderung in der Warteschlange. Das pooler versucht dann jede zurückzufordern Verbindungen, bis die Time-out erreicht (der Standard ist 15 Sekunden). Wenn die pooler kann die nicht befriedigen Anfrage vor den Verbindungszeiten out, wird eine Ausnahme ausgelöst.
Wenn Sie die Anwendung in einer regelmäßigen Art und Weise beenden, erwarte ich, dass die Finalizers laufen. Sie werden die Verbindung schließen, wenn es noch offen ist. Nur nicht davon abhängen. Es kann eine Weile dauern, bevor diese Finalizers im normalen Betrieb Ihrer Anwendung ausgeführt werden, so dass Sie zu viele Verbindungen offen zu halten
Wenn die Anwendung abstürzt, vielleicht der Finalizerthread wird nicht ausgeführt, die Verbindung offen über die Lebensdauer der Anwendung zu verlassen.