Sollte ich db für jede Abfrage öffnen und schließen?

8

Ich benutze alte Schule ADO.net mit C #, also gibt es eine Menge von dieser Art von Code. Ist es besser, pro Abfrage eine Funktion zu erstellen und die Datenbank jedes Mal zu öffnen und zu schließen oder mehrere Abfragen mit demselben Verbindungsobjekt auszuführen? Im Folgenden finden Sie nur eine Abfrage für Beispielzwecke.

%Vor%     
chobo 14.03.2011, 20:40
quelle

5 Antworten

7

In den meisten Fällen ist das Öffnen und Schließen einer Verbindung pro Abfrage der richtige Weg (wie Chris Lively bemerkte). Es gibt jedoch einige Fälle, bei denen es bei dieser Lösung zu Leistungsengpässen kommt.

Wenn Sie zum Beispiel mit sehr großen Mengen relativ schnell ausführbarer Abfragen arbeiten, die von vorherigen Ergebnissen abhängig sind, könnte ich vorschlagen, mehrere Abfragen in einer einzigen Verbindung auszuführen. Dies kann bei der Stapelverarbeitung von Daten oder bei der Datenbereinigung für Berichtszwecke auftreten.

Achten Sie immer darauf, den "using" -Wrapper zu verwenden, um Mem-Leaks zu vermeiden, unabhängig davon, welchem ​​Muster Sie folgen.

    
jbruton 14.03.2011, 20:50
quelle
11

Nun, Sie könnten messen; Aber solange Sie using der Verbindungen sind (also entsorgt werden, auch wenn Sie eine Ausnahme erhalten) und Pooling aktiviert haben (für SQL Server ist es standardmäßig aktiviert), spielt es keine große Rolle; closing (oder disposing) gibt nur die zugrunde liegende Verbindung zum Pool zurück. Beide Ansätze funktionieren. Sorry, das hilft nicht viel, p

Halte einfach keine offene Verbindung, während du andere langwierige Nicht-db-Arbeit machst. Schließe es und öffne es erneut. Sie können tatsächlich die gleiche zugrundeliegende Verbindung zurückbekommen, aber jemand anderes (ein anderer Thread) könnte es benutzt haben, während Sie es nicht waren.

    
Marc Gravell 14.03.2011 20:43
quelle
3

Wenn die Methoden so strukturiert sind, dass ein einzelner Befehl innerhalb einer einzigen Methode ausgeführt wird, dann: Ja: Instanziieren und entsorgen Sie die Verbindung für jeden Befehl.

Wenn die Methoden so strukturiert sind, dass mehrere Befehle im selben Codeblock ausgeführt werden, muss der äußere Block die using-Klausel für die Verbindung sein.

ADO ist sehr gut beim Verbindungs-Pooling, so dass die Instantiierung und das Entfernen des Befehlsobjekts extrem schnell sein wird und sich nicht wirklich auf die Leistung auswirkt.

Als Beispiel haben wir ein paar Seiten, die ein Update auf 50 Abfragen ausführen, um die Seite zu erstellen. Da es einen Verzweigungscode zum Ermitteln der auszuführenden Abfragen gibt, haben wir jede von ihnen mit ihren eigenen using (connection...) -Klauseln umhüllt.

Einmal haben wir diese rausgerissen und ein Verbindungsobjekt gegriffen und es an die einzelnen Methoden übergeben. Dies hatte genau null Leistungsverbesserung, während die Hölle aus dem Code mit allen Ausnahmeklauseln überall, um sicherzustellen, dass die Verbindung am Ende richtig angeordnet wurde verkompliziert. Am Ende des Tests haben wir den Code auf den vorherigen Stand zurückgesetzt. Viel sauberer, um genau zu wissen, was vor sich ging und wann eine Verbindung benutzt wurde.

    
NotMe 14.03.2011 20:43
quelle
2

Nun, wie immer, es kommt darauf an. Wenn Sie innerhalb desselben Methodenaufrufs 5 Datenbankaufrufe tätigen müssen, sollten Sie wahrscheinlich eine einzelne Verbindung verwenden.

Das Halten einer Verbindung, während nichts geschieht, wird jedoch normalerweise vom Standpunkt der Skalierbarkeit nicht empfohlen.

    
RQDQ 14.03.2011 20:43
quelle
2

ADO.NET ist jetzt Old School? Wow, du hast mich nur alt werden lassen. Rogue Wave ODBC mit Borland C ++ unter Windows 3.1 ist für mich Old School.

Um zu antworten, möchten Sie im Allgemeinen verstehen, wie Ihre Datentreiber arbeiten. Verstehen Sie solche Konzepte wie das Verbindungspooling und lernen Sie, die Transaktionskosten, die mit dem Verbinden / Trennen und Ausführen von Abfragen verknüpft sind, zu profilieren. Dann nimm dieses Wissen und wende es an deine Situation an.

    
Christopher Painter 14.03.2011 20:47
quelle

Tags und Links