Frage

Wir haben ein .NET-Objekt, das viel gelesen hat / mit der Datenbank zu schreiben. Während des gesamten Lebenszyklus dieses Objekts (oder die ASP-Seite, die es verwendet), kann es trifft die Datenbank mit einer Abfrage / Aktualisierung überall von 1 bis 10 mal.

Statt Öffnen und Schließen einer Datenbankverbindung jedes Mal das Objekt um die Datenbank treffen muss, öffnet es einfach eine Verbindung zur Datenbank während der Instanziierung und schließt dann die Verbindung während des Beendigungsereignisses des Objekts. Ist das eine schlechte Praxis?

Die Annahme war, dass, da das Objekt der Datenbank jedes Mal trifft es (und in der Regel mehrfach) instanziiert ist, wäre es besser, nur eine Verbindung öffnen zu Beginn des Lebens des Objekts und es dann am Ende zu schließen.

Die andere Alternative ist die Datenbankverbindung vor und nach jeder Abfrage / Betrieb zu öffnen und zu schließen.

Was ist die beste Praxis hier, um die Leistung zu maximieren?

**** Update **** Danke für die Tipps Jungs. Kann jemand mehr auf die Methode der Öffnung sprechen / eine Verbindung innerhalb eines Objekts Instanziierung / Kündigung Ereignisse und die Auswirkungen von so tun zu schließen?

War es hilfreich?

Lösung

Öffnen Sie ein Schließen Sie die Verbindung nach Bedarf. ADO.NET in Verbindung Pooling gebaut, das funktioniert. Sie erhalten keine Performance-Probleme feststellen, wenn Sie diese mit Tausenden von Open in einer Schleife tun / geschlossen wird.

Bearbeiten Siehe Soll ich anhalten eine SQLConnection in meiner Datenzugriffsschicht? für weitere Informationen in Bezug auf die Gefahren der Verbindung Persistenz.

Andere Tipps

Öffnen und schließen Sie jedes Mal ... Öffnen sofort (so nahe wie möglich) vor der Codezeile, dass die tatsächlichen die Datenbankoperation ausführt, und so bald wie möglich unmittelbar danach schließen. Wenn Sie dies auf diese Weise tun, wird ADO.net nicht in der Nähe tatsächlich die Verbindung, es gibt mir nur wieder in die ADO.net Connection Pool, wo er sitzt und wartet auf die nächste Anforderung für eine Verbindung mit dem gleichen conenction String. Sie entstehen nicht die ovberhead tatsächlich die Verbindung jedes Mal neu zu erstellen ...

Das einzige Problem ist, wenn Sie asynchron so viele Verbindungsversuche zu tun, die Sie die maximale Anzahl der Verbindungen im Pool überschreiten .... und es gibt Lösungen für dieses Problem auch, die System.Threading.ThreadPool Klasse. ..

, um das Vertrauen in Verbindung hinzuzufügen Argument Pooling - Halten Sie die Verbindung offen länger als benötigt wird, kann tatsächlich Abnahme Gesamtleistung, da der Verbindungspool nicht, dass die Verbindung mit anderen Komponenten teilen sich ein DB benötigen Verbindung.

Also, ja, öffnen und schließen Sie die Verbindung nach Bedarf. Obwohl, wäre es noch schneller sein, wenn Sie könnten Batch Ihre Abfragen in einen einzigen exec Anruf.

Auch wenn ado.net tatsächlich nicht die Verbindung schließen, wenn Sie das tun: Conn.Close () it „sp_reset_connection“ auf dem Server ausgeführt wird, selbst wenn sp_reset_connection ein leichtes Geschäft Verfahren ist, es einig Netzwerk-Traffic generieren. So zum Beispiel, würde ich nicht empfehlen, Schließen und Öffnen die Verbindung innerhalb einer Schleife.

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