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?

War es hilfreich?

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 Schreiben

SQL-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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top