web-dev-qa-db-de.com

Warum immer die Datenbankverbindung schließen?

Wenn eine Verbindung zu einer Datenbank viele Ressourcen beansprucht, warum sollte eine Datenbankverbindung in Ihrer Anwendung immer geschlossen werden, wenn Sie sie erneut öffnen müssen? Kann ich diese Verbindung in der gesamten Anwendung nur global verfügbar machen, damit andere Klassen und Methoden sie wiederverwenden können?

Zum Beispiel (in Pseudo-Code):

public class PopulateGridViews()
{
    public SqlConnection conn = new SqlConnection(@"Database:DATABASE");
    conn.Open();

    void PopulateGrid1()
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE1");
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        // Populate Grid1
    }

    void PopulateGrid2()
    {
        SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE2");
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        // Populate Grid2
    }
}
35
yonan2236

Sie sollten keine Verbindungen offen lassen.

Du solltest:

  1. Offene Verbindungen so spät wie möglich
  2. Schließen Sie die Verbindungen so schnell wie möglich

Die Verbindung selbst wird an den Verbindungspool zurückgegeben. Verbindungen sind eine begrenzte und relativ teure Ressource. Jede neue Verbindung, die Sie mit genau derselben Verbindungszeichenfolge erstellen, kann die Verbindung aus dem Pool wieder verwenden.

Wir empfehlen dringend, dass Sie immer Schließen Sie die Verbindung, wenn Sie .__ sind. fertig damit, so dass die Verbindung wird an die .__ zurückgegeben. Schwimmbad. Sie können dies mit der .__ tun. Schließen oder Entsorgen Sie die Methoden von Verbindungsobjekt oder durch Öffnen aller Verbindungen innerhalb einer using-Anweisung in C # oder eine Using-Anweisung in Visual Basic. Verbindungen, die nicht .__ sind. explizit geschlossen wird möglicherweise nicht hinzugefügt oder an den Pool zurückgegeben. Für mehr Informationen finden Sie unter using-Anweisung (C # Referenz) oder Gewusst wie: Entsorgen eines Systemressource für Visual Basic. Ref .

Sie sollten alles, was IDisposable implementiert, in einem using-Anweisungsblock entsprechend umschließen:

 using (SqlConnection connection = new SqlConnection(connectionString))
 {
     connection.Open();

     ...

     command.ExecuteNonQuery();
 }
49
Mitch Wheat

Weil (einige) Datenbanken auch eine Verbindung offenhalten, bis sie von der aufrufenden App aufgefordert wird, sie zu schließen. Wenn Sie Hunderte von Anrufen für eine Datenbank erhalten, ist die Datenbank mit 100 offenen Verbindungen belegt, die Ressourcen binden. Es ist nicht ungewöhnlich, dass Tausende oder Hunderttausende Aufrufe einer Datenbank in einer aktiven App erfolgen, und früher oder später wird die Leistung der DB die Leistung der App beeinträchtigen.

Es ist wirklich nur gesunder Menschenverstand. Wenn Sie einen guten Grund haben, es offen zu halten, dann tun Sie es. Wenn nicht, schließen Sie es, sobald Sie damit fertig sind. Es ist jedoch besser, die Gewohnheit zu haben, die Verbindungen zu schließen, damit Sie sie nicht einfach offen lassen, wenn Sie es nicht beabsichtigen. Es ist eine gute Angewohnheit, Ihren Sicherheitsgurt anzulegen oder die Kühlschranktür zu schließen, wenn Sie kein Essen herausbekommen.

Dieser Artikel beschreibt es gut (auch wenn es etwas veraltet ist):

http://www.bewebmaster.com/84.php

Ein häufiges Problem beim Hosting Unternehmen ist, dass ASP Websites nicht Schließen Sie die Datenbankverbindungen nach Sie sind geöffnet. Dies ist ein grundlegender Schritt dass Sie als Teil von .__ betrachten sollten. obligatorischer Code. Wenn Sie nicht schließen Ihre Datenbankverbindungen, viele Probleme können wie Webseiten auftreten hängen, langsames Laden von Seiten und mehr.

Stellen Sie sich vor, es geht durch eine Tür zu dein Haus. Vielleicht schließt sich die Tür von selbst, aber vielleicht nicht. Wenn es schließt nicht, wer weiß was wird geschehen. Wenn Sie auf dem Land wohnen, a Bär könnte hineingehen. Wenn Sie in der .__ leben. Stadt, ein Räuber könnte hineingehen. Okay, Nun, vielleicht verlässt er eine Datenbank Verbindung offen führt zu nichts so schlimm, aber es wird zu viel unnötige Kopfschmerzen für Sie und Ihre Hosting-Firma.

8
David

Es ist klar, wenn Sie die Verbindung nicht schließen, da dies Ihre Ressource kontinuierlich verbrauchen würde. Dies würde sich insgesamt auf Ihre Anwendung auswirken und möglicherweise nicht hinzugefügt oder dem Pool zurückgegeben werden.

0