Bewährtes Verfahren für die Wiederverwendung von SqlConnection

8

Ich bin von Java Erfahrung gekommen und versuche mit C # anzufangen. Ich habe gelesen SqlConnection SqlCommand SqlDataReader IDisposable und ich kann verstehen, dass die beste Vorgehensweise zum Herstellen einer Verbindung zu einem Die DB umschließt SqlConnection , SqlCommand und SqlDataReader in ihrem eigenen using -Block.

Aber in Java kapseln wir die Verbindung in eine Factory-Methode, erstellen sie nur einmal und verwenden sie für alle Abfragen, auch für Multithreads. Für jede Abfrage werden nur Anweisungen und Ergebnismengen erstellt und so schnell wie möglich geschlossen.

Wird für jede Abfrage kein neuer SqlConnection erstellt? Kann es nicht wiederverwendet werden?

    
Hikari 29.12.2014, 15:57
quelle

5 Antworten

16

Das Erstellen einer neuen Instanz der Klasse SqlConnection erstellt keine neue Netzwerkverbindung zu SQL Server, sondern least eine bestehende Verbindung (oder erstellt eine neue). .NET übernimmt das physische Verbindungs-Pooling für Sie.

Wenn Sie Ihre Verbindung beendet haben (über die Sie mehrere Abfragen senden können), geben Sie einfach Close() oder Dispose() ein (oder verwenden Sie vorzugsweise einen using{} -Block).

Es ist nicht erforderlich und nicht empfehlenswert, Instanzen der Klasse SqlConnection zwischenzuspeichern.

    
PhillipH 29.12.2014, 16:23
quelle
7

MS SQL-Server verwaltet Verbindungen in seinem eigenen Verbindungspool und sie werden nicht wirklich entsorgt. Sie sind jedoch geschlossen, sodass Sie den Netzwerkverkehr minimieren und die verfügbaren Verbindungen zu Ihrem Server freigeben.

Wenn Sie Linq-To-SQL verwenden, wird der Datenkontext die Verbindung erst freigeben, wenn sie entsorgt wird. Ich schlage vor, dass Sie nur bereits funktionierenden Code verwenden und nicht selbst versuchen, ihn zu optimieren.

    
VMAtm 29.12.2014 15:58
quelle
3

Wie VMAtm gesagt hat, .net Poolt die Verbindungen selbst, es ist also völlig in Ordnung, sie neu zu erstellen. Als solche schreibe ich generell einen Wrapper für den gesamten Prozess wie diesen.

%Vor%     
Ryan Mann 29.12.2014 16:32
quelle
1

Um Ihre spezifische Frage zu beantworten, können Sie SqlConnection für jede Abfrage wiederverwenden. Stellen Sie sicher, dass Sie Ihre aktuelle Abfrage ( SqlDataReader usw.) schließen, bevor Sie eine andere ausführen, dh. Wickle sie in ihre eigenen using Blöcke.

    
ElGavilan 29.12.2014 16:00
quelle
1

Ja, Sie können eine globale SqlConnection-Instanz erstellen. In meinem Fall verwende ich die SqlConnection als Mitglied meines DataContext, auf den ich über Singleton zugreife.

%Vor%

Sie können Ihre Transaktionen kapseln, indem Sie diese Verbindung schließen und öffnen, d. h .:

%Vor%

Oder Sie lassen die Verbindung offen, sondern beginnen und beenden Transaktionen stattdessen:

%Vor%     
Flaudre 30.12.2014 09:23
quelle