2009-05-14 7 views
37

Ich habe eine einfache statische Klasse mit ein paar Methoden drin. Jede dieser Methoden öffnet eine SqlConnection, fragt die Datenbank ab und schließt die Verbindung. Auf diese Weise bin ich mir sicher, dass ich immer die Verbindung zur Datenbank schließe, aber auf der anderen Seite möchte ich nicht immer die Verbindung öffnen und schließen. Im Folgenden sehen Sie ein Beispiel dafür, wie meine Methoden aussehen.Wann sollte ich eine Verbindung zu SQL Server öffnen und schließen

public static void AddSomething(string something) 
{ 
    using (SqlConnection connection = new SqlConnection("...")) 
    { 
     connection.Open(); 
     // ... 
     connection.Close(); 
    } 
} 

Bedenkt man, dass die Verfahren innerhalb einer statischen Klasse sind, soll ich ein statisches Mitglied eine einzelne SqlConnection enthalten? Wie und wann sollte ich es fallen lassen? Was sind die besten Praktiken?

Antwort

45

Nein, halten Sie keine statische SqlConnection, es sei denn, Sie müssen. Threading wäre eine Sorge, aber noch wichtiger - normalerweise müssen Sie es einfach nicht tun. Mit Ihrem Code, wie er dargestellt wird, bedeutet das interne Verbindungs-Pooling, dass Sie meistens die gleiche zugrunde liegende Verbindung bei aufeinanderfolgenden Aufrufen erhalten (solange Sie die gleiche Verbindungszeichenfolge verwenden). Lass den Pooler seine Arbeit machen; lass den Code in Ruhe.

Dies vermeidet auch die Probleme, was passiert, wenn Sie beginnen, zwei Threads zu haben ... jetzt kann jeder an ihrer eigenen Verbindung arbeiten; mit statischen (vorausgesetzt, Sie verwenden nicht [ThreadStatic]) müssten Sie synchronisieren, Verzögerungen einzuführen. Ganz zu schweigen von der Re-Entrance (d. H. Ein einzelner Thread versucht, dieselbe Verbindung zweimal gleichzeitig zu verwenden). Jep; lass den Code in Ruhe. Es ist jetzt in Ordnung, und fast jede Änderung, die du machst, würde es nicht gut machen.

3

Die meisten Programmierer glauben, offen zu spät und zu früh zu schließen. Dies ist nur ein Problem, wenn die Latenzzeit für das Öffnen und Schließen der Verbindung jedes Mal die gesamte Anwendung verlangsamt.

In Ihrem Fall mit einer statischen Klasse ist es wahrscheinlich am besten, die Verbindung jedes Mal zu öffnen und zu schließen.

+1

+1 Um den Downvote auszugleichen. Selbst ein erneutes Öffnen in einem Pool führt zu einem Aufruf von sp_resetconnection, was zu einer (wenn auch kleinen) Latenz führt. – Andomar

1

Sie machen die Best Practices. Öffne es nur, bevor du es abfragst, und schließe es so schnell wie möglich. Diese Art von Dingen mag auf den ersten Blick verschwenderisch erscheinen, macht Ihre Anwendung auf lange Sicht jedoch skalierbarer.

+0

Dies gilt nur, wenn Skalierbarkeit sogar möglich ist. Für z.B. Bei einer App mit einer eingebetteten Datenbank würden verschiedene Überlegungen gelten. –

18

Da SqlConnection über einen Verbindungspool verfügt, wenn Sie Open() und Close() aufrufen, öffnen und schließen Sie die physische Verbindung zum Server nicht. Sie fügen gerade die Verbindung aus einem Pool verfügbarer Verbindungen hinzu oder entfernen sie. Aus diesem Grund empfiehlt es sich, die Verbindung so spät wie möglich zu öffnen und die Verbindung so bald wie möglich nach der Ausführung des Befehls zu schließen.

5

In Ihrem Codebeispiel ist es nicht erforderlich, die close() -Methode für das Verbindungsobjekt aufzurufen, da diese automatisch behandelt wird, da der Code in einem using-Block liegt.

-1

Verlassen Sie sich niemals auf die Verbindung, um sich selbst zu schließen. Wenn es nicht explizit geschlossen wird, führt dies zu Leistungsproblemen. Das ist uns bei unserem Projekt passiert. Ja, mir ist bewusst, dass Verbindungen von einem Verbindungspool verwaltet werden, aber sie müssen immer noch geschlossen und in den Pool zurückgegeben werden.

+0

Er hat einen 'using'-Anruf um die SqlConnection herum, so dass er die Verbindung entsorgen sollte, sobald es fertig ist – lisburnite

Verwandte Themen