Udostępnij przez


Buforowanie połączeń menedżera sterowników

Buforowanie połączeń umożliwia aplikacji korzystanie z połączenia z puli połączeń, które nie muszą być ponownie nawiązane przy każdym użyciu. Po utworzeniu i umieszczeniu połączenia w puli aplikacja może ponownie użyć tego połączenia bez wykonywania pełnego procesu połączenia.

Użycie połączenia w puli może spowodować znaczne zwiększenie wydajności, ponieważ aplikacje mogą zaoszczędzić nakład pracy związany z nawiązywaniem połączenia. Może to być szczególnie istotne w przypadku aplikacji warstwy środkowej łączących się za pośrednictwem sieci lub aplikacji, które wielokrotnie łączą się i rozłączają, na przykład aplikacje internetowe.

Oprócz wzrostu wydajności, architektura puli połączeń umożliwia wykorzystywanie środowiska i powiązanych z nim połączeń przez wiele komponentów w jednym procesie. Oznacza to, że składniki autonomiczne w tym samym procesie mogą współpracować bez świadomości nawzajem. Połączenie w puli połączeń może być wielokrotnie używane przez wiele komponentów.

Uwaga / Notatka

Buforowanie połączeń może być używane przez aplikację ODBC wykazującą zachowanie ODBC 2.x, o ile aplikacja może wywołać funkcję SQLSetEnvAttr. W przypadku korzystania z buforowania połączeń aplikacja nie może wykonywać instrukcji SQL, które zmieniają bazę danych lub kontekst bazy danych, takie jak zmiana < nazwy >, która zmienia wykaz używany przez źródło danych.

Sterownik ODBC musi być w pełni bezpieczny wątkowo, a połączenia nie mogą mieć przywiązania wątkowego, aby obsługiwać pulę połączeń. Oznacza to, że sterownik jest w stanie obsłużyć wywołanie dowolnego wątku w dowolnym momencie i jest w stanie nawiązać połączenie w jednym wątku, użyć połączenia w innym wątku i odłączyć się od trzeciego wątku.

Pula połączeń jest utrzymywana przez Menadżera sterowników. Połączenia są pobierane z puli, gdy aplikacja wywołuje funkcję SQLConnect lub SQLDriverConnect i są zwracane do puli, gdy aplikacja wywołuje funkcję SQLDisconnect. Rozmiar puli rośnie dynamicznie na podstawie żądanych alokacji zasobów. Zmniejsza się w zależności od limitu czasu braku aktywności: jeśli połączenie jest nieaktywne przez pewien czas (nie było używane w połączeniu), zostanie usunięte z puli. Rozmiar puli jest ograniczony tylko przez ograniczenia pamięci i limity na serwerze.

Menedżer sterowników określa, czy określone połączenie w puli powinno być używane zgodnie z argumentami przekazanymi w programie SQLConnect lub SQLDriverConnect, a zgodnie z atrybutami połączenia ustawionymi po przydzieleniu połączenia.

Gdy Menedżer sterowników zarządza pulą połączeń, musi mieć możliwość określenia, czy połączenie jest wciąż aktywne przed przekazaniem połączenia. W przeciwnym razie Menedżer sterowników ciągle przekazuje martwe połączenie do aplikacji za każdym razem, gdy wystąpi przejściowy błąd sieci. Nowy atrybut połączenia został zdefiniowany w ODBC 3*.x*: SQL_ATTR_CONNECTION_DEAD. Jest to atrybut połączenia tylko do odczytu, który zwraca SQL_CD_TRUE lub SQL_CD_FALSE. Wartość SQL_CD_TRUE oznacza, że połączenie zostało utracone, a wartość SQL_CD_FALSE oznacza, że połączenie jest nadal aktywne. (Sterowniki zgodne z wcześniejszymi wersjami ODBC mogą również obsługiwać ten atrybut).

Sterownik musi skutecznie zaimplementować tę opcję, inaczej obniży to wydajność zarządzania pulą połączeń. W szczególności wywołanie pobierania tego atrybutu połączenia nie powinno powodować zapytania do serwera. Zamiast tego sterownik powinien zwrócić ostatni znany stan połączenia. Połączenie jest nieaktywne, jeśli ostatnia podróż do serwera nie powiodła się i nie jest martwa, jeśli ostatnia podróż zakończyła się pomyślnie.

Uwagi

Jeśli połączenie zostało utracone (zgłoszone za pośrednictwem SQL_ATTR_CONNECTION_DEAD), menedżer sterowników ODBC zniszczy to połączenie, wywołując sqlDisconnect w sterowniku. Nowe żądania połączeń mogą nie znaleźć odpowiedniego połączenia do wykorzystania w puli. W końcu Menedżer sterowników może nawiązać nowe połączenie, zakładając, że pula jest pusta.

Aby użyć puli połączeń, aplikacja wykonuje następujące kroki:

  1. Włącza buforowanie połączeń przez wywołanie metody SQLSetEnvAttr w celu ustawienia atrybutu środowiska SQL_ATTR_CONNECTION_POOLING na wartość SQL_CP_ONE_PER_DRIVER lub SQL_CP_ONE_PER_HENV. To wezwanie należy wykonać przed przydzieleniem przez aplikację środowiska udostępnionego, dla którego ma zostać włączone zarządzanie pulą połączeń. Uchwyt środowiska w wywołaniu SQLSetEnvAttr powinien być ustawiony na null, co sprawia, że SQL_ATTR_CONNECTION_POOLING staje się atrybutem na poziomie procesu. Jeśli atrybut jest ustawiony na SQL_CP_ONE_PER_DRIVER, dla każdego sterownika jest obsługiwana pojedyncza pula połączeń. Jeśli aplikacja współpracuje z wieloma sterownikami i kilkoma środowiskami, może to być bardziej wydajne, ponieważ może być wymagana mniejsza liczba porównań. Jeśli ustawiono wartość SQL_CP_ONE_PER_HENV, dla każdego środowiska jest obsługiwana pojedyncza pula połączeń. Jeśli aplikacja współpracuje z wieloma środowiskami i kilkoma sterownikami, może to być bardziej wydajne, ponieważ może być wymagana mniejsza liczba porównań. Buforowanie połączeń jest wyłączone przez ustawienie SQL_ATTR_CONNECTION_POOLING na SQL_CP_OFF.

  2. Przydziela środowisko przez wywołanie metody SQLAllocHandle z argumentem HandleType ustawionym na SQL_HANDLE_ENV. Środowisko przydzielone przez to wywołanie będzie domyślnym środowiskiem udostępnionym, ponieważ włączono buforowanie połączeń. Środowisko, które ma być używane, nie jest jednak określane, dopóki program SQLAllocHandle z parametrem HandleType SQL_HANDLE_DBC jest wywoływany w tym środowisku.

  3. Przydziela połączenie, wywołując metodę SQLAllocHandle z parametrem InputHandle ustawioną na SQL_HANDLE_DBC, a właściwość InputHandle ustawiona na uchwyt środowiska przydzielony do buforowania połączeń. Menedżer sterowników próbuje znaleźć istniejące środowisko zgodne z atrybutami środowiska ustawionymi przez aplikację. Jeśli takie środowisko nie istnieje, zostanie utworzone i będzie miało liczbę odwołań (utrzymywaną przez Menedżera Sterowników) równą 1. Jeśli zostanie znalezione zgodne środowisko udostępnione, środowisko zostanie zwrócone do aplikacji, a jego liczba odwołań zostanie zwiększona. (Rzeczywiste połączenie, które ma być używane, nie jest określane przez Menedżera sterowników do momentu wywołania programu SQLConnect lub SQLDriverConnect ).

  4. Wywołuje program SQLConnect lub SQLDriverConnect, aby nawiązać połączenie. Menedżer sterowników używa opcji połączenia w wywołaniu do programu SQLConnect (lub słów kluczowych połączenia w wywołaniu do programu SQLDriverConnect) i atrybutów połączenia ustawionych po alokacji połączenia w celu określenia, które połączenie w puli powinno być używane.

    Uwaga / Notatka

    Sposób dopasowania żądanego połączenia do połączenia w puli jest określany przez atrybut środowiska SQL_ATTR_CP_MATCH. Aby uzyskać więcej informacji, zobacz SQLSetEnvAttr.

    Aplikacje ODBC korzystające z buforowania połączeń powinny wywoływać metodę CoInitializeEx podczas inicjowania aplikacji i coUninitialize , gdy aplikacja zostanie zamknięta.

  5. Wywołuje SQLDisconnect po zakończeniu połączenia. Połączenie jest zwracane do puli połączeń i staje się dostępne do ponownego użycia.

Szczegółowe omówienie można znaleźć w temacie Pooling w składnikach dostępu do danych Microsoft.

Zagadnienia dotyczące puli połączeń

Wykonanie dowolnej z następujących akcji przy użyciu polecenia SQL (a nie za pośrednictwem interfejsu API ODBC) może mieć wpływ na stan połączenia i spowodować nieoczekiwane problemy, gdy buforowanie połączeń jest aktywne:

  • Otwieranie połączenia i zmienianie domyślnej bazy danych.

  • Za pomocą instrukcji SET można zmienić wszelkie konfigurowalne opcje (w tym SET ROWCOUNT, ANSI_NULL, IMPLICIT_TRANSACTIONS, SHOWPLAN, STATISTICS, TEXTSIZE i DATEFORMAT).

  • Tworzenie tabel tymczasowych i procedur składowanych.

Jeśli którakolwiek z tych akcji jest wykonywana poza interfejsem API ODBC, następna osoba, która korzysta z połączenia, automatycznie odziedziczy poprzednie ustawienia, tabele lub procedury.

Uwaga / Notatka

Nie należy oczekiwać, że niektóre ustawienia będą obecne w stanie połączenia. Zawsze należy ustawić stan połączenia w aplikacji i upewnić się, że aplikacja usunie wszystkie nieużywane ustawienia puli połączeń.

buforowanie połączeń Driver-Aware

Począwszy od Windows 8, sterownik ODBC może bardziej efektywnie korzystać z połączeń w puli. Aby uzyskać więcej informacji, zobacz Driver-Aware Zarządzanie Pulą Połączeń.

Zobacz też

Nawiązywanie połączenia ze źródłem danych lub sterownikiem
Tworzenie sterownika ODBC
Buforowanie w składnikach dostępu do danych firmy Microsoft