2010-11-06 9 views
31

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

Zum Beispiel (in Pseudocode):

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 
    } 
} 
+0

Ich würde vorschlagen, [SQL Server Connection Pooling (ADO.NET)] (http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx) zu lesen. –

Antwort

45

Sie sollten keine Verbindungen offen lassen.

Sie sollten:

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

Die Verbindung selbst ist an den Verbindungspool zurückgegeben. Verbindungen sind eine begrenzte und relativ teure Ressource. Jede neue Verbindung, die Sie einrichten, die genau die gleiche Verbindungszeichenfolge hat, wird die Verbindung aus dem Pool wiederverwenden können.

Wir empfehlen dringend, dass Sie immer die Verbindung zu schließen, wenn Sie sind mit ihm fertig, so dass die Verbindung wird den Pool zurückgegeben werden. Sie können dies mithilfe der Methoden Schließen oder Dispose des Verbindungsobjekts oder durch Öffnen aller Verbindungen innerhalb einer using-Anweisung in C# oder einer Using-Anweisung in Visual Basic tun. Verbindungen, die nicht explizit sind, wurden möglicherweise nicht hinzugefügt oder in den Pool zurückgegeben. Weitere Informationen finden Sie unter Verwenden der Anweisung (C# Referenz) oder Vorgehensweise: Disponieren einer Systemressource für Visual Basic. Ref.

Sie sollten in geeigneter Weise etwas wickeln, die IDisposable in einem using Anweisungsblock implementiert:

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

    ... 

    command.ExecuteNonQuery(); 
} 
+0

Wo sollte ich meinen Catch setzen, wenn während der Verbindung einige Fehler auftreten? – yonan2236

+1

Wenn Sie den Verwendungsblock wie @Mitch Wheat verwenden, wird dieser bei einem Fehler automatisch geschlossen. – David

+0

So gibt es keine Möglichkeit festzustellen, die aufgetretenen Fehler zu kennen? – yonan2236

6

Weil (einige) Datenbanken auch eine Verbindung offen halten, bis sie von der anrufenden App gesagt, es zu schließen. Wenn Sie Hunderte von Anrufen zu einer Datenbank erhalten, dann sitzt sie dort mit 100 offenen Verbindungen, die Ressourcen binden. Es ist nicht ungewöhnlich, dass in einer ausgelasteten App Tausende oder Hunderttausende von Anrufen an eine Datenbank gesendet werden. Früher oder später wird die Leistung der App durch die DB-Leistung beeinträchtigt.

Es ist wirklich nur gesunder Menschenverstand. Wenn Sie einen gültigen Grund haben, es offen zu halten, dann tun Sie es. Wenn nicht, schließen Sie es, sobald Sie damit fertig sind. Aber es ist besser, die gute Angewohnheit zu haben, die Verbindungen zu schließen, damit man sie nicht einfach offen lässt, wenn man es nicht beabsichtigt. Es ist eine gute Angewohnheit, deinen Sicherheitsgurt zu tragen oder die Kühlschranktür zu schließen, wenn du kein Essen bekommst.

erklärt dieser Artikel geht es gut (auch wenn es ein bisschen veraltet ist):

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

Ein häufiges Problem bei Hosting Unternehmen ist, dass ASP-Websites tun, um die Datenbankverbindungen nach nicht schließen Sie sind geöffnet. Dies ist ein grundlegender Schritt , den Sie als Teil des obligatorischen Codes betrachten sollten. Wenn Sie nicht schließen Ihre Datenbankverbindungen, können viele Probleme wie Webseiten hängen, langsame Seitenladevorgänge und mehr auftreten.

Betrachten Sie es als durch eine Tür gehen zu Ihr Haus. Vielleicht wird die Tür von selbst schließen, aber vielleicht wird es nicht. Wenn es nicht schließt, wer weiß, was passieren wird. Wenn Sie auf dem Land leben, könnte ein Bär gehen. Wenn Sie in der Stadt leben, könnte ein Straßenräuber gehen. Okay, gut vielleicht eine Datenbank verlassen Verbindung offen zu nichts führt dass schlecht, aber es wird zu vielen unnötigen Kopfschmerzen für Sie und Ihre Hosting-Firma führen.

+1

Wir hatten eine Anwendung, die wir bei Arbeitsleckverbindungen geerbt haben, es ist nicht nett :(Nach einer Weile reagierte der SQL Server nicht mehr auf neue Verbindungen. Es bedeutete auch, dass jede andere Anwendung nicht mehr funktionierte. – Skurmedel

Verwandte Themen