Frage

Wir haben eine Web-Service in C # codiert, die viele Anrufe auf MS SQL Server 2005-Datenbank macht. Der Code verwendet Blöcke mit # C kombiniert mit 's Connection Pooling.

Während ein SQL-Trace, sahen wir viele, viele Anrufe "sp_resetconnection". Die meisten davon sind kurz <0,5 s, aber manchmal bekommen wir Anrufe zu 9 Sekunden dauert.

Von dem, was ich sp_resetconnection ist im Zusammenhang mit Verbindungs-Pooling und im Grunde setzt den Zustand einer offenen Verbindung gelesen habe. Meine Fragen:

  • Warum eine offene Verbindung benötigt seinen Zustand zurückgesetzt?
  • Warum so viele dieser Anrufe!
  • Was einen Anruf dazu führen könnte, den Anschluss an sp_reset eine nicht-triviale Menge Zeit in Anspruch nehmen.

Das ist ziemlich das Geheimnis für mich, und ich schätze irgendwelche und alle Hilfe!

War es hilfreich?

Lösung

Der Reset setzt einfach Dinge, so dass Sie nicht auf Reconnect sie zurückgesetzt werden. Es löscht die Verbindung sauber Dinge wie SET oder USE-Operationen, so dass jede Abfrage eine reine Weste hat.

Die Verbindung noch wiederverwendet wird. Hier ist eine umfangreiche Liste :

sp_reset_connection setzt die folgenden Aspekte einer Verbindung:

  • Es setzt alle Fehlerzustände und Nummern (zB @@ error)
  • Es stoppt alle (Ausführungskontexte) der EG, die Kind sind Themen eines Elternteils EG eine parallele Abfrage
  • Ausführen
  • Es wird für alle noch ausstehenden I / O-Operationen warten, das aussteht
  • Es wird durch die Verbindung alle gehaltenen Puffer auf dem Server freigeben
  • Es wird keine Pufferressourcen freischalten, die durch die Verbindung verwendet werden
  • Es wird lösen alle Speicher durch die Verbindung zugewiesen Besitz
  • Es wird keine Arbeit oder temporäre Tabellen löschen, die durch die Verbindung erstellt werden
  • Es werden alle globalen Cursor durch die Verbindung
  • Besitz töten
  • Es werden alle offenen SQL-XML-Griffe schließen, die geöffnet
  • sind
  • Es wird löschen Sie alle offenen SQL-XML-bezogene Arbeit Tabellen
  • Es werden alle Systemtabellen schließen
  • Es werden alle Benutzertabellen schließen
  • Es werden alle temporäre Objekte fallen
  • Es wird abbrechen offene Transaktionen
  • Es wird von einer verteilten Transaktion Defekt beim eingetragen
  • Es wird den Referenzzähler für die Benutzer in der aktuellen Datenbank verringern; die die Freisetzung gemeinsam genutzte Datenbank Schloss
  • Es wird erworbene Sperren frei Haus
  • Es wird gibt alle Griffe, die erworben wurden, können
  • Es werden alle SET-Optionen auf die Standardwerte zurückgesetzt
  • Es wird zurückgesetzt, den @@ rowcount Wert
  • Es wird zurückgesetzt, den @@ identity Wert
  • Es wird keine Session-Ebene Trace-Optionen zurückgesetzt dbcc traceon mit ()

sp_reset_connection wird nicht zurückgesetzt:

  • Sicherheit Kontext, weshalb Verbindungspooling Streichhölzer Verbindungen basierend auf der genauen Verbindungszeichenfolge ist
  • Wenn Sie eine Anwendungsrolle mit sp_setapprole eingegeben, da Anwendungsrollen können nicht
  • rückgängig gemacht werden
  • Die Transaktionsisolationsstufe (!)

Andere Tipps

Hier ist eine Erklärung von Was tut sp_reset_connection? , die sagt, teilweise " der Datenzugriff API Schichten wie ODBC, OLE-DB und SqlClient rufen sie die (interne) gespeicherte Prozedur sp_reset_connection, wenn eine Verbindung von einem Verbindungspool wiederverwenden. es tut dies, um den Zustand der Verbindung zurückgesetzt werden, bevor es wieder verwendet wird.“ Dann gibt es einige Besonderheiten, was das System sproc tut. Es ist eine gute Sache.

sp_resetconnection erhält genannt jedes Mal wenn Sie eine neue Verbindung aus einem Pool anfordern. Es hat dies zu tun, da der Pool den Benutzer nicht garantieren kann (Sie, der Programmierer wahrscheinlich :) die Verbindung in ordnungsgemäßem Zustand verlassen hat. z.B. eine alte Verbindung mit Uncommited Transaktionen zurückkehrend ..bad würde.

Die nr der Anrufe an die nr Mal in Beziehung gesetzt werden, sollten Sie eine neue Verbindung holen.

Wie für einige Anrufe nicht-triviale Menge an Zeit zu nehmen, bin ich nicht sicher. Könnte sein, der Server nur sehr beschäftigte Verarbeitung andere Sachen zu dieser Zeit. Könnten Verzögerungen im Netzwerk sein.

Im Grunde genommen sind die Anrufe der ausräumen Statusinformationen. Wenn Sie alle geöffneten Datareaders haben wird es viel länger dauern auftreten. Dies liegt daran, Ihre Datareader sind nur eine einzige Zeile zu halten, könnten aber mehr Reihen ziehen. Sie haben jeweils auch gelöscht werden, bevor die Reset fortfahren kann. So stellen Sie sicher, dass Sie alles haben, sich mit der () Aussagen und sind die Dinge nicht offen in einigen Ihrer Aussagen zu verlassen.

Wie viele Verbindungen insgesamt tun Sie laufen, wenn dies geschieht?

Wenn Sie eine max von 5 und Sie treffen alle 5 dann ein Reset-Aufruf blockiert - und es erscheint eine lange Zeit in Anspruch nehmen. Es ist wirklich nicht, es ist nur eine zusammengefasste Verbindung verfügbar wird blockiert warten.

Auch wenn Sie auf SQL Express laufen Sie sehr leicht aufgrund Threading Anforderungen blockiert werden können (auch in voller SQL Server passieren könnte, aber viel weniger wahrscheinlich ist).

Was passiert, wenn Sie das Verbindungspooling deaktivieren?

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