2009-07-16 10 views
10

Ich habe eine Client-Server-App, die .NET SqlClient Data Provider verwendet, um eine Verbindung zu SQL-Server - ziemlich Standard-Zeug. Wie lange müssen Verbindungen standardmäßig inaktiv sein, bevor der Verbindungspooling-Manager die Datenbankverbindung schließt und aus dem Pool entfernt? Welche Einstellung steuert das?Wie lange muss eine SQL Server-Verbindung inaktiv sein, bevor sie vom Verbindungspool geschlossen wird?

This MSDN document sagt nur

Die Verbindung pooler eine Verbindung aus dem Pool entfernt, nachdem es für eine lange Zeit untätig gewesen ist, oder wenn der pooler feststellt, dass die Verbindung mit dem Server durchtrennt wurde.

Antwort

7

Vor ein paar Jahren die Antwort unter war die Situation, aber jetzt ist es so geändert, dass Sie in die source und aufzuschreiben eine Zusammenfassung :)


Alte Antwort verweisen

This excellent article erzählt Wir müssen wissen, was wir wissen müssen, indem wir Reflektionen verwenden, um das Innenleben von Connection-Pooling aufzudecken.

Wie ich es verstehe, werden 'geschlossene' Verbindungen periodisch in einem halb zufälligen Intervall aufgeräumt. Der Bereinigungsprozess wird irgendwo zwischen 2 Minuten und 3 Minuten 50 Sekunden ausgeführt, muss jedoch zweimal ausgeführt werden, bevor eine "geschlossene" Verbindung ordnungsgemäß geschlossen wird. Daher sollte die zugrunde liegende SQL-Verbindung nach 7min 40s "geschlossen" ordnungsgemäß geschlossen sein, aber es könnte so kurz wie 2min sein. Zum Zeitpunkt des Schreibens hatte der erste Verbindungspool, der in einem Prozess erstellt wurde, immer ein Zeitgeberintervall von 3 Minuten 10 Sekunden. Daher würden SQL-Verbindungen normalerweise zwischen 3 Minuten 10 Sekunden und 6 Minuten 20 Sekunden nach dem Aufruf von Close() auf dem ADO-Objekt geschlossen .

Offensichtlich verwendet dies undokumentierten Code, so könnte in Zukunft ändern - oder könnte sogar geändert haben, seit dieser Artikel geschrieben wurde.

+1

Sei vorsichtig hier. Die [Implementierung] (http://referencesource.microsoft.com/#System.Data/System/Data/ProviderBase/DbConnectionInternal.cs525) hat sich geändert, so dass die von diesem Artikel offengelegten Interna nicht mehr zutreffen. Die Verbindung ist wirklich aufgeräumt. – Alexander

0

Bitte gehen Sie durch diese:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring%28VS.80%29.aspx

Der Teil

"Die folgende Tabelle listet die gültigen Namen für Verbindungs-Pooling-Werte im Connectionstring"

scheint von Interesse zu sein.

+0

hmmm ... die einzige Einstellung, die dort angebracht sein könnte, ist Load Balance Timeout, aber das ist ein Minimum, nicht eine maximale Zeit, also sollte es die Verbindung länger dauern. Ich möchte wissen, was "Leerlauf für eine lange Zeit" standardmäßig bedeutet. Wenn das Verbindungs-Pooling feststellt, dass eine Verbindung inaktiv war, sollte sie nicht vom Verbindungs-Timeout für SQL Server abhängig sein. Gibt es auch so etwas wie das Verbindungstimeout des SQL Servers? – Rory

+0

Mit Connection Lifetime können Sie die maximale Lebensdauer einer Verbindung bestimmen (Leerlauf + verwendete Zeit). –

+0

Entfernt den Teil über Verbindungstimeout. Nach den verfügbaren Daten, kann nicht sagen, wenn. NET wird die Verbindung zu schließen, aber mit Connection Lifetime & Load Balance Timeout, denke ich, dass Sie etwas kontrollieren können, wenn die Verbindung bricht. Auch beibehalten Parameter von SQl Server wird tote Verbindungen (nicht im Leerlauf Verbindungen) im Falle von TCP/IP. –

Verwandte Themen