Wir haben einen in C # codierten Web-Service, der viele Aufrufe der MS SQL Server 2005-Datenbank aufruft. Der Code verwendet die Verwendung von Blöcken, die mit dem Verbindungs-Pooling von C # kombiniert werden.
Während einer SQL-Ablaufverfolgung haben wir viele, viele Aufrufe von "sp_resetconnection" gesehen. Die meisten davon sind kurz & lt; 0,5 Sekunden, aber manchmal bekommen wir Anrufe, die bis zu 9 Sekunden dauern.
Nach dem, was ich gelesen habe, ist sp_resetconnection mit dem Verbindungspooling verbunden und setzt grundsätzlich den Zustand einer offenen Verbindung zurück. Meine Fragen:
Das ist ziemlich das Mysterium für mich, und ich schätze jede und jede Hilfe!
Durch das Zurücksetzen werden die Dinge einfach zurückgesetzt, sodass Sie sie nicht mehr zurücksetzen müssen, um sie zurückzusetzen. Es löscht die Verbindung sauber von Dingen wie SET oder USE-Operationen, so dass jede Abfrage eine saubere Weste hat.
Die Verbindung wird immer noch verwendet. Hier ist eine umfangreiche Liste :
sp_reset_connection setzt die folgenden Aspekte einer Verbindung zurück:
sp_reset_connection wird NICHT zurückgesetzt:
Hier ist eine Erklärung von Was macht sp_reset_connection? , die teilweise "Data Access API" -Schichten wie ODBC sagt , OLE-DB und SqlClient rufen die (interne) gespeicherte Prozedur sp_reset_connection auf, wenn sie eine Verbindung aus einem Verbindungspool wiederverwenden. Dadurch wird der Zustand der Verbindung zurückgesetzt, bevor sie wieder verwendet wird. " Dann gibt es einige Besonderheiten dessen, was dieses System tut. Es ist eine gute Sache.
sp_resetconnection wird jedes Mal aufgerufen, wenn Sie eine neue Verbindung von einem Pool anfordern. Es muss dies tun, da der Pool den Benutzer nicht garantieren kann (Sie, der Programmierer wahrscheinlich :) haben die Verbindung in einem ordnungsgemäßen Zustand verlassen. z.B. Die Rückgabe einer alten Verbindung mit nicht übergebenen Transaktionen wäre ... schlecht.
Die Anzahl der Anrufe sollte sich auf die Anzahl der Zeiten beziehen, zu denen Sie eine neue Verbindung erhalten.
Was einige Anrufe angeht, die nicht trivial sind, bin ich mir nicht sicher. Könnte sein, dass der Server gerade sehr beschäftigt ist, andere Sachen zu dieser Zeit zu verarbeiten. Könnte Netzwerkverzögerungen sein.
Grundsätzlich sind die Anrufe die Statusinformationen zum Löschen. Wenn Sie irgendwelche offenen DataReader haben, wird es viel länger dauern. Dies liegt daran, dass Ihre DataReader nur eine einzelne Zeile enthalten, aber mehr Zeilen ziehen können. Sie müssen jeweils gelöscht werden, bevor das Zurücksetzen fortgesetzt werden kann. Stellen Sie also sicher, dass Sie alles mit () -Anweisungen haben, und lassen Sie einige Dinge in einigen Ihrer Aussagen nicht offen.
Wie viele Verbindungen haben Sie, wenn das passiert?
Wenn Sie maximal 5 haben und alle 5 drücken, wird das Zurücksetzen blockiert - und es wird lange dauern. Es ist wirklich nicht, es ist nur blockiert warten auf eine gepoolte Verbindung verfügbar zu sein.
Auch wenn Sie mit SQL Express arbeiten, können Sie aufgrund von Threading-Anforderungen sehr leicht blockiert werden (könnte auch in vollem SQL Server passieren, aber viel weniger wahrscheinlich).
Was passiert, wenn Sie das Verbindungs-Pooling deaktivieren?
Tags und Links c# sql-server-2005 connection-pooling sp-reset-connection