OLE DB-, ODBC- und Oracle-Verbindungspooling
Durch Verbindungspooling kann die Leistung und Skalierbarkeit einer Anwendung wesentlich erhöht werden. In diesem Artikel wird das Verbindungspooling für die .NET Framework-Datenanbieter für OLE DB, ODBC und Oracle erläutert.
OLEDB
Der .NET Framework-Datenanbieter für OLE DB vereinigt automatisch Verbindungen mithilfe des OLE DB-Sitzungspoolings. Mithilfe von Argumenten für Verbindungszeichenfolgen können OLE DB-Dienste, einschließlich Pooling, aktiviert und deaktiviert werden. Beispielsweise werden mit der folgenden Verbindungszeichenfolge das OLE DB-Sitzungspooling und die automatische Eintragung von Transaktionen deaktiviert.
Provider=SQLOLEDB;OLE DB Services=-4;Data Source=localhost;Integrated Security=SSPI;
Wichtig
Microsoft empfiehlt, immer den sichersten Authentifizierungsflow zu verwenden. Wenn Sie eine Verbindung mit Azure SQL herstellen, ist Managed Identities for Azure Resources die empfohlene Authentifizierungsmethode.
Es wird empfohlen, nach Abschluss der Verwendung einer Verbindung diese immer zu schließen oder zu verwerfen, um die Verbindung an den Pool zurückzugeben. Verbindungen, die nicht explizit geschlossen werden, werden möglicherweise nicht an den Pool zurückgegeben. Beispielsweise wird eine Verbindung, die sich nicht mehr im Reservierungsumfang befindet, aber nicht explizit geschlossen wurde, nur dann an den Verbindungspool zurückgegeben, wenn die maximale Poolgröße erreicht wurde und die Verbindung immer noch gültig ist.
Weitere Informationen zum OLE DB-Sitzungspooling oder -Ressourcenpooling sowie zum Deaktivieren des Poolings durch Überschreiben der Standardwerte für den OLE DB-Anbieterdienst finden Sie im OLE DB-Programmierhandbuch.
ODBC
Das Verbindungspooling für .NET Framework-Datenanbieter für ODBC wird von dem für die Verbindung verwendeten ODBC-Treiber-Manager verwaltet und wird nicht vom .NET Framework-Datenanbieter für ODBC beeinflusst.
Um das Verbindungspooling zu aktivieren bzw. deaktivieren, öffnen Sie in der Systemsteuerung im Ordner „Verwaltung“ den ODBC-Datenquellenadministrator. Auf der Registerkarte Verbindungspooling können Sie die Verbindungspoolingparameter für jeden installierten ODBC-Treiber angeben. Änderungen des Verbindungspoolings für einen bestimmten ODBC-Treiber betreffen alle Anwendungen, die diesen ODBC-Treiber verwenden.
OracleClient
Der .NET Framework-Datenanbieter für Oracle stellt das Verbindungspooling für die ADO.NET-Clientanwendung automatisch bereit. Sie können auch mehrere Modifizierer für Verbindungszeichenfolgen angeben, um das Verbindungspoolingverhalten zu steuern (siehe „Steuern von Verbindungspooling mit Verbindungszeichenfolgen-Schlüsselwörtern“ weiter unten in diesem Artikel).
Erstellen und Zuweisen von Pools
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. Jedem Verbindungspool wird eine eindeutige Verbindungszeichenfolge zugeordnet. Wenn beim Öffnen einer neuen Verbindung die Verbindungszeichenfolge nicht genau mit einem vorhanden Pool übereinstimmt, wird ein neuer Pool erstellt.
Erstellte Verbindungspools werden erst zerstört, wenn der aktive Prozess beendet wird. Das Beibehalten inaktiver oder leerer Pools verbraucht nur geringe Systemressourcen.
Hinzufügen einer Verbindung
Für jede eindeutige Verbindungszeichenfolge wird ein Verbindungspool erstellt. Wenn ein Pool erstellt wird, werden mehrere Verbindungsobjekte erstellt und dem Pool hinzugefügt wird, sodass die minimalen Anforderungen für die Größe eines Pools erfüllt sind. Verbindungen werden dem Pool nach Bedarf hinzugefügt, bis die maximale Poolgröße erreicht ist.
Wenn ein OracleConnection-Objekt angefordert wird, wird es aus dem Pool abgerufen, wenn eine verwendbare Verbindung verfügbar ist. Eine Verbindung ist dann verwendbar, wenn sie aktuell nicht verwendet wird, einen übereinstimmenden Transaktionskontext aufweist oder keinem Transaktionskontext zugeordnet ist sowie über eine gültige Verknüpfung zum Server verfügt.
Wenn die maximale Poolgröße erreicht ist und keine verwendbare Verbindung verfügbar ist, wird die Anforderung in die Warteschlange gestellt. Die Verbindungspoolfunktion erfüllt diese Anforderungen, indem Verbindungen erneut zugewiesen werden, sobald sie wieder für den Pool freigegeben werden. Verbindungen werden wieder für den Pool freigegeben, wenn sie geschlossen oder verworfen werden.
Entfernen einer Verbindung
Die Verbindungspoolfunktion entfernt eine Verbindung aus dem Pool, nachdem sie für eine längere Zeitspanne nicht verwendet wurde oder wenn festgestellt wird, dass die Verbindung mit dem Server unterbrochen wurde. Dies lässt sich nur bei dem Versuch, mit dem Server zu kommunizieren, feststellen. Wenn eine Verbindung gefunden wird, die nicht mehr mit dem Server verbunden ist, wird sie als ungültig markiert. Die Verbindungspoolfunktion 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 ohne dass die Verbindungspoolfunktion die unterbrochene Verbindung gefunden und als ungültig markiert hat aus dem Pool genommen werden. In diesem Fall wird eine Ausnahme ausgelöst. Sie müssen die Verbindung dennoch trennen, um sie an den Pool zurückzugeben.
Rufen Sie nicht Close
oder Dispose
für eine Connection
, einen DataReader
oder ein anderes verwaltetes Objekt in der Finalize
-Methode der Klasse auf. Geben Sie in einer Finalize-Methode nur nicht verwaltete Ressourcen frei, die der Klasse direkt gehören. Wenn die Klasse keine nicht verwalteten Ressourcen besitzt, definieren Sie in der Klasse keine Finalize
-Methode. Weitere Informationen finden Sie unter Garbage Collection.
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 in Verbindungen unterteilt, denen kein Transaktionskontext zugewiesen ist, und in n Teilbereiche, die jeweils Verbindungen für einen bestimmten Transaktionskontext enthalten.
Wenn eine Verbindung geschlossen wird, wird sie an den Pool und an den entsprechenden Teilbereich auf der Grundlage des Transaktionskontexts zurückgegeben. Sie können die Verbindung daher trennen, ohne einen Fehler zu generieren, auch wenn eine verteilte Transaktion noch aussteht. So haben Sie die Möglichkeit, die verteilte Transaktion zu einem späteren Zeitpunkt durchzuführen oder abzubrechen.
Steuerung des Verbindungspoolings mit Schlüsselwörtern für die Verbindungszeichenfolge
Die ConnectionString-Eigenschaft des OracleConnection-Objekts unterstützt Schlüssel-Wert-Paare für Verbindungszeichenfolgen, mit denen das Verhalten der Verbindungspoolinglogik angepasst werden kann.
In der folgenden Tabelle werden die ConnectionString-Werte beschrieben, die zum Anpassen des Verbindungspoolingverhaltens verwendet werden können.
Name | Standard | BESCHREIBUNG |
---|---|---|
Connection Lifetime |
0 | Wenn eine Verbindung an den Pool zurückgegeben wird, wird die Erstellungszeit mit der aktuellen Zeit verglichen. Wenn diese Zeitspanne (in Sekunden) größer ist als der für die Connection Lifetime angegebene Wert, wird die Verbindung zerstört. Dies ist hilfreich bei Gruppenkonfigurationen, um einen Lastenausgleich zwischen einem bereits aktiven Server und einem Server zu erzwingen, der gerade erst online gegangen ist.Der Wert 0 (null) bewirkt, dass an den Pool zurückgegebene Verbindungen den maximalen Timeout besitzen. |
Enlist |
"true" | Im Falle von true wird die Verbindung automatisch von der Poolfunktion im aktuellen Transaktionskontext des Erstellungsthreads aufgelistet, wenn ein Transaktionskontext vorhanden ist. |
Max Pool Size |
100 | Die maximale Anzahl der im Pool zulässigen Verbindungen. |
Min Pool Size |
0 | Die minimale Anzahl der im Pool beibehaltenen Verbindungen. |
Pooling |
"true" | Im Falle von true wird die Verbindung aus dem entsprechenden Pool entnommen oder bei Bedarf erstellt und dem entsprechenden Pool hinzugefügt. |