Sollte das Verbindungs-Pooling so viel langsamer sein als das Öffnen einer Verbindung?

8

Wie meine vorherige Frage: Wie man mit der Datenbank verbunden bleibt bis Bildschirm schließen?

Zuerst möchte ich mich bei Ihnen entschuldigen, dass ich meine Situation nicht erkläre.

Nun, meine Situation ist update bis zu hundert Datensätzen. Ich erstelle mit For loop eine echte Arbeit und protokolliere deren Ergebnis.

%Vor%

Hier ist eine Leistungsklasse.

%Vor%

Und das sind Log-Ergebnisse

%Vor%

Ich wurde mit Verbindungspooling geübt. Aber diese Ergebnisse, die gezeigt werden, bleiben mit der Datenbank verbunden sind schneller in vielen Aufzeichnungen Situation.

Gibt es irgendeine Praxis, die für diesen Fall geeignet ist?

BEARBEITEN: 21.02.2017

Hier ist eine offene Verbindung bei geöffnetem Formularcode:

%Vor%

Aktualisierungscode:

%Vor%

Und entsorgen Sie die Verbindung beim Beenden

%Vor%     
Monkawee Maneewalaya 20.02.2017, 05:56
quelle

3 Antworten

4

Vom Standpunkt der Reaktionsfähigkeit eines einzelnen Threads wird das Offenhalten der Verbindung schneller sein. Der Zweck des Verbindungspoolings besteht darin, die Kosten für das Öffnen neuer Verbindungen zu reduzieren, indem sie für Threads freigegeben werden, während gleichzeitig keine übermäßige Anzahl von Verbindungen auf dem gemeinsam genutzten SQL Server verbraucht wird.

Jedes Mal, wenn eine Verbindung zum Verbindungspool freigegeben und dann wiederverwendet wird, wird der Protokollstapel einen Aufruf von sp_resetconnection aufrufen, um den Status auf dem Server zu bereinigen. Sie können dies sehen, indem Sie eine Profiler-Ablaufverfolgung für den SQL Server ausführen.

Da jeder Prozess über einen eigenen Verbindungspool für jede Verbindungszeichenfolge verfügt, profitieren Sie nur dann vom Verbindungspooling, wenn Konflikte für die Verbindungen innerhalb eines Prozesses bestehen.

    
Phil Pledger 23.02.2017 17:31
quelle
2

Der Teil, den alle hier vermissen, ist das Windows CE . Es ist nicht ungewöhnlich, dass Opening Connections auf der Compact Edition wirklich langsam sind.

Aber diese Zeiten sehen ein bisschen übertrieben aus. Siehe diese QA für Problemumgehungen: Wie kann ich meine SQL Server CE-Verbindung öffnen? schneller?

    
Jeremy Thompson 23.02.2017 06:02
quelle
0

Es gibt eine Reihe von Bereichen, in denen Sie Probleme mit dem obigen Code haben können.

  • Sie erstellen eine einzelne SqlConnection -Instanz.
  • Alle Ihre Event-Handler rufen eine statische Funktion auf, die auf die eine SqlConnection-Instanz verweist.
  • Ihre Ereignishandler überprüfen nicht, ob sie im Hauptthread der Benutzeroberfläche ausgeführt werden.

Die Klasse SqlConnection wird automatisch Verbindungen unter den Covern zusammenfassen. Wenn Sie die Funktion close() aufrufen, geht die Verbindung einfach in den Pool zurück. Sie können das Poolingverhalten mit Eigenschaften in der Verbindungszeichenfolge steuern. Wenn Sie für alle Ihre Funktionen dasselbe Verbindungsobjekt beibehalten, erzwingen Sie deren Serialisierung.

Hier ist ein Verweis auf einige Verbindungszeichenfolgeneigenschaften . Schauen Sie sich Connection Lifetime an.

Ich würde die SqlConnection Instanz aus der form_load() Funktion entfernen und ScanUpdate wie folgt schreiben:

%Vor%

Achten Sie bei Ihren *_Click -Ereignishandlerfunktionen darauf, zu überprüfen, ob das Ereignis erneut aufgerufen werden muss:

%Vor%

Weitere Informationen zur Ereignisbehandlung finden Sie in dieser Antwort .

    
saarp 02.03.2017 00:19
quelle