Verbindungspooling des Treiber-Managers

Verbinden ion-Pooling ermöglicht es einer Anwendung, eine Verbindung aus einem Pool von Verbindungen zu verwenden, die nicht für jede Verwendung neu eingerichtet werden müssen. Nachdem eine Verbindung erstellt und in einem Pool platziert wurde, kann eine Anwendung diese Verbindung wiederverwenden, ohne den vollständigen Verbindungsvorgang auszuführen.

Die Verwendung einer poolierten Verbindung kann zu erheblichen Leistungsgewinnen führen, da Anwendungen den Aufwand für die Herstellung einer Verbindung sparen können. Dies kann besonders für Anwendungen auf mittlerer Ebene von Bedeutung sein, die eine Verbindung über ein Netzwerk oder für Anwendungen herstellen, die wiederholt eine Verbindung herstellen und trennen, z. B. Internetanwendungen.

Zusätzlich zu Leistungssteigerungen ermöglicht die Verbindungspoolarchitektur eine Umgebung und die zugehörigen Verbindungen, die von mehreren Komponenten in einem einzigen Prozess verwendet werden. Dies bedeutet, dass eigenständige Komponenten im selben Prozess miteinander interagieren können, ohne einander bewusst zu sein. Eine Verbindung in einem Verbindungspool kann wiederholt von mehreren Komponenten verwendet werden.

Hinweis

Verbinden ion-Pooling kann von einer ODBC-Anwendung mit ODBC 2 verwendet werden.x-Verhalten, solange die Anwendung SQLSetEnvAttr aufrufen kann. Bei Verwendung von Verbindungspooling darf die Anwendung keine SQL-Anweisungen ausführen, die die Datenbank oder den Kontext der Datenbank ändern, z. B. den Datenbanknamen> ändern, wodurch <der von einer Datenquelle verwendete Katalog geändert wird.

Ein ODBC-Treiber muss vollständig threadsicher sein, und Verbindungen dürfen keine Threadaffinität aufweisen, um verbindungspooling zu unterstützen. Dies bedeutet, dass der Treiber jederzeit einen Aufruf für jeden Thread verarbeiten kann und in der Lage ist, eine Verbindung mit einem Thread herzustellen, die Verbindung in einem anderen Thread zu verwenden und die Verbindung mit einem dritten Thread zu trennen.

Der Verbindungspool wird vom Treiber-Manager Standard unterstützt. Verbinden ionen werden aus dem Pool gezeichnet, wenn die Anwendung aufruft SQL Verbinden oder SQLDriver Verbinden und werden an den Pool zurückgegeben, wenn die Anwendung SQLDisconnect aufruft. Die Größe des Pools wächst dynamisch, basierend auf den angeforderten Ressourcenzuordnungen. Sie wird basierend auf dem Inaktivitätstimeout verkleinern: Wenn eine Verbindung für einen bestimmten Zeitraum inaktiv ist (sie wurde nicht in einer Verbindung verwendet), wird sie aus dem Pool entfernt. Die Größe des Pools ist nur durch Speichereinschränkungen und Grenzwerte auf dem Server begrenzt.

Der Treiber-Manager bestimmt, ob eine bestimmte Verbindung in einem Pool gemäß den argumenten verwendet werden soll, die in SQL Verbinden oder SQLDriver Verbinden übergeben werden sollen, und entsprechend den Verbindungsattributen, die nach der Zuordnung der Verbindung festgelegt wurden.

Wenn der Treiber-Manager Verbindungen poolt, muss er feststellen können, ob eine Verbindung noch funktioniert, bevor die Verbindung übergeben wird. Andernfalls gibt der Treiber-Manager die inaktive Verbindung mit der Anwendung immer dann aus, wenn ein vorübergehender Netzwerkfehler auftritt. In ODBC 3*.x*: SQL_ATTR_CONNECTION_DEAD wurde ein neues Verbindungsattribute definiert. Dies ist ein schreibgeschütztes Verbindungsattribute, das entweder SQL_CD_TRUE oder SQL_CD_FALSE zurückgibt. Der Wert SQL_CD_TRUE bedeutet, dass die Verbindung verloren gegangen ist, während der Wert SQL_CD_FALSE bedeutet, dass die Verbindung noch aktiv ist. (Treiber, die mit früheren VERSIONEN von ODBC übereinstimmen, können dieses Attribut auch unterstützen.)

Ein Treiber muss diese Option effizient implementieren oder die Leistung des Verbindungspools beeinträchtigen. Insbesondere sollte ein Aufruf zum Abrufen dieses Verbindungsattributs keinen Roundtrip zum Server verursachen. Stattdessen sollte ein Treiber nur den letzten bekannten Zustand der Verbindung zurückgeben. Die Verbindung ist tot, wenn die letzte Reise zum Server fehlgeschlagen ist, und nicht tot, wenn die letzte Reise erfolgreich war.

Hinweise

Wenn eine Verbindung verloren gegangen ist (über SQL_ATTR_CONNECTION_DEAD gemeldet), zerstört der ODBC-Treiber-Manager diese Verbindung durch Aufrufen von SQLDisconnect im Treiber. Neue Verbindungsanforderungen finden möglicherweise keine verwendbare Verbindung im Pool. Schließlich kann der Treiber-Manager eine neue Verbindung herstellen, vorausgesetzt, der Pool ist leer.

Um einen Verbindungspool zu verwenden, führt eine Anwendung die folgenden Schritte aus:

  1. Ermöglicht das Verbindungspooling durch Aufrufen von SQLSetEnvAttr , um das attribut der SQL_ATTR_CONNECTION_POOLING Umgebung auf SQL_CP_ONE_PER_DRIVER oder SQL_CP_ONE_PER_HENV festzulegen. Dieser Aufruf muss erfolgen, bevor die Anwendung die freigegebene Umgebung zuweist, für die verbindungspooling aktiviert werden soll. Das Umgebungshandle im Aufruf von SQLSetEnvAttr sollte auf NULL festgelegt werden, wodurch SQL_ATTR_CONNECTION_POOLING ein Attribut auf Prozessebene festgelegt wird. Wenn das Attribut auf SQL_CP_ONE_PER_DRIVER festgelegt ist, wird für jeden Treiber ein einzelner Verbindungspool unterstützt. Wenn eine Anwendung mit vielen Treibern und wenigen Umgebungen arbeitet, ist dies möglicherweise effizienter, da weniger Vergleiche erforderlich sind. Bei Festlegung auf SQL_CP_ONE_PER_HENV wird für jede Umgebung ein einzelner Verbindungspool unterstützt. Wenn eine Anwendung mit vielen Umgebungen und wenigen Treibern arbeitet, ist dies möglicherweise effizienter, da weniger Vergleiche erforderlich sind. Verbinden ion-Pooling wird deaktiviert, indem SQL_ATTR_CONNECTION_POOLING auf SQL_CP_OFF festgelegt wird.

  2. Weist eine Umgebung zu, indem SQLAllocHandle aufgerufen wird, wobei das HandleType-Argument auf SQL_HANDLE_ENV festgelegt ist. Die von diesem Aufruf zugewiesene Umgebung ist eine implizite freigegebene Umgebung, da verbindungspooling aktiviert wurde. Die zu verwendende Umgebung wird jedoch erst bestimmt, wenn SQLAllocHandle mit einem HandleType von SQL_HANDLE_DBC für diese Umgebung aufgerufen wird.

  3. Weist eine Verbindung zu, indem SQLAllocHandle aufgerufen wird, wobei InputHandle auf SQL_HANDLE_DBC festgelegt ist, und der InputHandle-Satz auf das Umgebungshandle, das für die Verbindungspooling zugeordnet ist. Der Treiber-Manager versucht, eine vorhandene Umgebung zu finden, die den von der Anwendung festgelegten Umgebungsattributen entspricht. Wenn keine solche Umgebung vorhanden ist, wird eine mit einer Referenzanzahl (Standard vom Treiber-Manager) von 1 erstellt. Wenn eine übereinstimmende freigegebene Umgebung gefunden wird, wird die Umgebung an die Anwendung zurückgegeben, und die Referenzanzahl wird erhöht. (Die tatsächliche zu verwendende Verbindung wird vom Treiber-Manager erst bestimmt, wenn SQL Verbinden oder SQLDriver Verbinden wird aufgerufen.)

  4. Ruft SQL Verbinden oder SQLDriver Verbinden auf, um die Verbindung herzustellen. Der Treiber-Manager verwendet die Verbindungsoptionen im Aufruf von SQL Verbinden (oder die Verbindung Schlüsselwort (keyword)s im Aufruf von SQLDriver Verbinden) und die Verbindungsattribute, die nach der Verbindungszuweisung festgelegt wurden, um zu bestimmen, welche Verbindung im Pool verwendet werden soll.

    Hinweis

    Wie eine angeforderte Verbindung mit einer poolierten Verbindung abgeglichen wird, wird durch das SQL_ATTR_CP_MATCH Umgebungsattribut bestimmt. Weitere Informationen finden Sie unter SQLSetEnvAttr.

    ODBC-Anwendungen, die Verbindungspooling verwenden, sollten CoInitializeEx während der Anwendungsinitialisierung aufrufen und CoUninitialisieren, wenn die Anwendung geschlossen wird.

  5. Ruft SQLDisconnect auf, wenn die Verbindung abgeschlossen ist. Die Verbindung wird an den Verbindungspool zurückgegeben und steht zur Wiederverwendung zur Verfügung.

Eine ausführliche Erläuterung finden Sie unter "Pooling" in den Microsoft Data Access-Komponenten.

Überlegungen zur Verbinden ion von Pooling

Das Ausführen einer der folgenden Aktionen mit einem SQL-Befehl (und nicht über die ODBC-API) kann sich auf den Status der Verbindung auswirken und unerwartete Probleme verursachen, wenn die Verbindungspooling aktiv ist:

  • Öffnen einer Verbindung und Ändern der Standarddatenbank

  • Verwenden der SET-Anweisung zum Ändern konfigurierbarer Optionen (einschließlich SET ROWCOUNT, ANSI_NULL, IMPLICIT_TRANSACTIONS, SHOWPLAN, STATISTICS, TEXTSIZE und DATEFORMAT).

  • Erstellen temporärer Tabellen und gespeicherter Prozeduren.

Wenn eine dieser Aktionen außerhalb der ODBC-API ausgeführt wird, erbt die nächste Person, die die Verbindung verwendet, automatisch die vorherigen Einstellungen, Tabellen oder Prozeduren.

Hinweis

Erwarten Sie nicht, dass bestimmte Einstellungen im Verbindungszustand vorhanden sind. Sie sollten immer den Verbindungsstatus in Ihrer Anwendung festlegen und sicherstellen, dass die Anwendung alle nicht verwendeten Verbindungspooleinstellungen entfernt.

Treiberfähiges Verbindungspooling

Ab Windows 8 kann ein ODBC-Treiber Verbindungen im Pool effizienter verwenden. Weitere Informationen finden Sie unter Driver-Aware Verbinden ion Pooling.

Weitere Informationen

Herstellen einer Verbindung mit einer Datenquelle oder einem Treiber
Developing an ODBC Driver (Entwickeln eines ODBC-Treibers)
Pooling in den Microsoft Data Access-Komponenten