Freigeben über


Verbindungspooling für den .NET Framework-Datenprovider für SQL Server

Durch Verbindungspooling kann die Leistung und Skalierbarkeit einer Anwendung deutlich verbessert werden. Der .NET Framework-Datenprovider für SQL Server stellt für ADO.NET-Clientanwendungen automatisch das Verbindungspooling bereit. Sie können auch mehrere Modifizierer für Verbindungszeichenfolgen angeben, um das Verhalten des Verbindungspoolings zu steuern (siehe Abschnitt "Steuern des Verbindungspoolings mit Schlüsselwörtern für Verbindungszeichenfolgen" weiter unten in diesem Thema).

Poolerstellung und -zuweisung

Wenn eine Verbindung hergestellt wird, wird ein Verbindungspool basierend auf einem exakt übereinstimmenden Algorithmus erstellt. Damit wird der Pool der Verbindungszeichenfolge in der Verbindung zugewiesen. Jeder Verbindungspool wird einer eindeutigen Verbindungszeichenfolge zugewiesen. Wenn eine neue Verbindung hergestellt wird und die Verbindungszeichenfolge nicht exakt mit einem vorhandenen Pool übereinstimmt, wird ein neuer Pool erstellt.

Im folgenden Beispiel werden drei neue SqlConnection-Objekte erstellt, es sind jedoch nur zwei Verbindungspools zu ihrer Verwaltung erforderlich. Beachten Sie, dass die erste und zweite Verbindungszeichenfolge sich durch den Wert unterscheiden, der Initial Catalog zugewiesen ist.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();      
// Pool A is created.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();      
// Pool B is created because the connection strings differ.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();      
// The connection string matches pool A.

Erstellte Verbindungspools werden erst zerstört, wenn der aktive Prozess endet. Für die Pflege inaktiver oder leerer Pools ist ein minimaler Systemaufwand erforderlich.

Hinzufügen von Verbindungen

Für jede eindeutige Verbindungszeichenfolge wird ein Verbindungspool erstellt. Bei der Erstellung eines Pools werden mehrere Verbindungsobjekte erstellt und dem Pool hinzugefügt, damit die minimale Poolgröße erreicht wird. Den Anforderungen entsprechend werden Verbindungen bis zur maximalen Poolgröße hinzugefügt.

Wenn ein SqlConnection-Objekt angefordert wird, wird es aus dem Pool abgerufen, sofern eine verwendbare Verbindung verfügbar ist. Die Verbindung ist dann verwendbar, wenn sie derzeit nicht genutzt wird, einen übereinstimmenden Transaktionskontext besitzt oder keinem Transaktionskontext zugewiesen ist und einen gültigen Link zum Server besitzt.

Wenn die maximale Poolgröße erreicht ist und keine verwendbare Verbindung vorhanden ist, wird die Anforderung in die Warteschlange gestellt. Sobald Verbindungen wieder an den Pool zurückgegeben werden, weist der Verbindungspooler diese erneut zu und ermöglicht so die Ausführung dieser Anforderungen. Verbindungen werden in den Pool zurückgegeben, wenn Sie für das Connection-Objekt Close oder Dispose aufrufen.

**Vorsicht   **Um die Verbindung an den Pool zurückzugeben, wird empfohlen, das Connection-Objekt stets zu schließen, wenn Sie es nicht mehr benötigen. Dazu verwenden Sie entweder die Close-Methode oder die Dispose-Methode des Connection-Objekts. Verbindungen, die nicht ausdrücklich beendet werden, werden u. U. nicht dem Pool hinzugefügt oder an ihn zurückgegeben. Eine aus dem Gültigkeitsbereich gefallene Verbindung, die nicht explizit geschlossen wurde, wird nur dann an den Verbindungspool zurückgegeben, wenn die maximale Poolgröße erreicht wurde und die Verbindung weiterhin gültig ist.

Hinweis   Rufen Sie für ein Connection-Objekt, ein DataReader-Objekt oder ein beliebiges anderes in der Finalize-Methode einer Klasse verwaltetes Objekt nicht Close oder Dispose auf. Geben Sie in einem Finalizer nur nicht verwaltete Ressourcen frei, deren direkter Eigentümer die jeweilige Klasse ist. Wenn eine Klasse keine nicht verwalteten Ressourcen besitzt, fügen Sie in der Klassendefinition keine Finalize-Methode ein. Weitere Informationen finden Sie unter Programmieren für die Garbage Collection.

Entfernen von Verbindungen

Der Verbindungspooler entfernt eine Verbindung aus dem Pool, wenn die Lebensdauer der Verbindung abgelaufen ist oder der Pooler feststellt, dass die Verbindung zum Server unterbrochen wurde. Dies kann jedoch nur festgestellt werden, nachdem versucht wurde, mit dem Server zu kommunizieren. Wenn eine Verbindung gefunden wird, die nicht mehr mit dem Server verbunden ist, wird sie als ungültig markiert. Der Verbindungspooler durchsucht Verbindungspools in regelmäßigen Abständen nach Objekten, die dem Pool übergeben wurden und als ungültig markiert sind. Diese Verbindungen werden dann endgültig entfernt.

Wenn eine Verbindung zu einem nicht mehr vorhandenen Server besteht, kann diese Verbindung auch dann aus dem Pool genommen werden, wenn der Verbindungspooler die unterbrochene Verbindung nicht festgestellt und als ungültig markiert hat. In diesem Fall wird eine Ausnahme ausgelöst. Sie müssen die Verbindung dennoch trennen, um sie an den Pool zurückzugeben.

Transaktionsunterstützung

Verbindungen werden aus dem Pool entnommen und basierend auf dem Transaktionskontext zugewiesen. Der Kontext des anfordernden Threads und der zugewiesenen Verbindung müssen übereinstimmen. Daher wird jeder Verbindungspool unterteilt in Verbindungen, denen kein Transaktionskontext zugewiesen ist, und in N Teilbereiche, die Verbindungen mit einem bestimmten Transaktionskontext enthalten.

Wenn eine Verbindung getrennt wird, wird sie an den Pool und, basierend auf dem Transaktionskontext, in den richtigen Teilbereich zurückgegeben. Sie können die Verbindung daher trennen, ohne einen Fehler zu erzeugen, auch wenn eine verteilte Transaktion noch ausstehend ist. So haben Sie die Möglichkeit, die verteilte Transaktion zu einem späteren Zeitpunkt durchzuführen oder abzubrechen.

Steuern des Verbindungspoolings mit Schlüsselwörtern für Verbindungszeichenfolgen

Die ConnectionString-Eigenschaft des SqlConnection-Objekts unterstützt Schlüssel-Wert-Paare für Verbindungszeichenfolgen, mit denen das Verhalten der Logik des Verbindungspoolings angepasst werden kann.

In der folgenden Tabelle werden die ConnectionString-Werte genannt, mit denen Sie das Verhalten des Verbindungspoolings anpassen können.

Name Standard-wert Beschreibung
Connection Lifetime 0 Wenn eine Verbindung an den Pool zurückgegeben wird, wird der Zeitpunkt der Erstellung mit dem aktuellen Zeitpunkt verglichen. Übersteigt diese Zeitspanne (in Sekunden) den mit Connection Lifetime festgelegten Wert, wird die Verbindung zerstört. Dies ist hilfreich in Gruppenkonfigurationen, um den Lastenausgleich zwischen einem bereits aktiven Server und einem Server zu erzwingen, der gerade erst online gegangen ist.

Der Wert Null (0) bewirkt, dass Poolverbindungen den maximalen Timeout besitzen.

Connection Reset true Legt fest, ob die Datenbankverbindung zurückgesetzt wird, wenn sie aus dem Pool entfernt wird. Wenn Sie die Einstellung für Microsoft SQL Server, Version 7.0, auf False festlegen, werden zusätzliche Server-Roundtrips beim Abrufen einer Verbindung verhindert. Dabei dürfen Sie jedoch nicht vergessen, dass der Verbindungsstatus, wie der Datenbankkontext, nicht zurückgesetzt wird.
Enlist true Mit dem Wert True listet der Pooler die Verbindung automatisch im aktuellen Transaktionskontext des Erstellungsthreads auf, wenn ein Transaktionskontext vorhanden ist.
Max Pool Size 100 Die maximale Anzahl von Verbindungen, die im Pool zulässig sind.
Min Pool Size 0 Die minimale Anzahl von Verbindungen, die im Pool verwaltet werden.
Pooling true Mit dem Wert True wird die Verbindung aus dem entsprechenden Pool genommen oder, falls erforderlich, erstellt und dem entsprechenden Pool hinzugefügt.

Leistungsindikatoren für das Verbindungspooling

Der .NET Framework-Datenprovider für SQL Server fügt mehrere Leistungsindikatoren hinzu, mit denen Sie die Eigenschaften des Verbindungspoolings optimieren sowie periodische Probleme im Zusammenhang mit fehlgeschlagenen Verbindungsversuchen und Probleme im Zusammenhang mit abgelaufenen Anforderungen an den SQL-Server ermitteln können.

In der folgenden Tabelle werden die Indikatoren für das Verbindungspooling angezeigt, auf die in der Leistungsüberwachung unter dem .NET CLR Data-Leistungsobjekt zugegriffen werden kann.

Indikator Beschreibung
SqlClient: Current # of pooled and non pooled connections Aktuelle Anzahl der Verbindungen (gepoolt und nicht gepoolt).
SqlClient: Current # pooled connections Aktuelle Anzahl der Verbindungen in allen Pools, die mit dem Prozess verbunden sind.
SqlClient: Current # connection pools Aktuelle Anzahl der Pools, die mit dem Prozess verbunden sind.
SqlClient: Peak # pooled connections Die höchste Anzahl von Verbindungen in allen Pools, seit der Prozess gestartet wurde. Hinweis: Dieser Indikator ist nur verfügbar, wenn er mit einer bestimmten Prozessinstanz verbunden ist. Die _Global-Instanz gibt stets den Wert 0 zurück.
SqlClient: Total # failed connects Die Gesamtzahl der Versuche, eine Verbindung herzustellen, die aus irgendeinem Grund fehlgeschlagen sind.

Hinweis   Wenn Sie die Leistungsindikatoren des .NET Framework-Datenproviders für SQL Server zusammen mit ASP.NET-Anwendungen verwenden, steht nur die _Global-Instanz zur Verfügung. Aufgrund dessen ist der vom Leistungsindikator zurückgegebene Wert die Summe der Werte der Indikatoren für alle ASP.NET-Anwendungen.

Siehe auch

Herstellen einer Verbindung zu einer Datenquelle mit ADO.NET | Datenzugriff mit .NET-Datenprovidern | SqlConnection-Klasse