Поделиться через


Организация пулов соединений диспетчера драйверов

Подключение пул позволяет приложению использовать подключение из пула подключений, которые не нужно повторно устанавливать для каждого использования. После создания и размещения соединения в пуле приложение может повторно использовать это подключение, не выполняя полный процесс подключения.

Использование подключения в пуле может привести к значительному повышению производительности, так как приложения могут сэкономить затраты, связанные с подключением. Это может быть особенно важно для приложений среднего уровня, которые подключаются через сеть или для приложений, которые многократно подключаются и отключают, например интернет-приложения.

Помимо повышения производительности архитектура пула подключений позволяет среде и связанным с ним подключениям использоваться несколькими компонентами в одном процессе. Это означает, что автономные компоненты в одном процессе могут взаимодействовать друг с другом, не зная друг друга. Подключение в пуле соединений можно использовать многократно несколькими компонентами.

Примечание.

Подключение пулов можно использовать приложением ODBC, демонстрирующим ODBC 2.Поведение x, если приложение может вызывать SQLSetEnvAttr. При использовании пула подключений приложение не должно выполнять инструкции SQL, которые изменяют базу данных или контекст базы данных, например изменение <имени базы данных, которая изменяет каталог>, используемый источником данных.

Драйвер ODBC должен быть полностью потокобезопасным, и подключения не должны иметь сходство потоков для поддержки пула подключений. Это означает, что драйвер может обрабатывать вызов любого потока в любое время и может подключаться к одному потоку, использовать подключение к другому потоку и отключать на третьем потоке.

Пул подключений поддерживается диспетчером драйверов. Подключение извлекаются из пула при вызове приложенияSQL Подключение или SQLDriver Подключение и возвращаются в пул при вызове SQLDisconnect приложения. Размер пула динамически увеличивается на основе запрошенных выделений ресурсов. Он уменьшается на основе времени ожидания бездействия: если соединение неактивно в течение определенного периода времени (оно не использовалось в соединении), оно удаляется из пула. Размер пула ограничен только ограничениями памяти и ограничениями на сервере.

Диспетчер драйверов определяет, следует ли использовать определенное соединение в пуле в соответствии с аргументами, переданными в SQL Подключение или SQLDriver Подключение и в соответствии с атрибутами подключения, заданными после выделения соединения.

Если диспетчер драйверов пулов подключений, он должен иметь возможность определить, работает ли подключение до передачи подключения. В противном случае диспетчер драйверов продолжает передавать мертвое подключение к приложению всякий раз, когда возникает временный сбой сети. Новый атрибут подключения определен в ODBC 3*.x*: SQL_ATTR_CONNECTION_DEAD. Это атрибут подключения только для чтения, который возвращает SQL_CD_TRUE или SQL_CD_FALSE. Значение SQL_CD_TRUE означает, что соединение было потеряно, а значение SQL_CD_FALSE означает, что подключение по-прежнему активно. (Драйверы, соответствующие более ранним версиям ODBC, также могут поддерживать этот атрибут.)

Драйвер должен эффективно реализовать этот параметр или будет ухудшать производительность пула подключений. В частности, вызов для получения этого атрибута подключения не должен вызывать круговую поездку на сервер. Вместо этого драйвер должен просто вернуть последнее известное состояние подключения. Подключение замеро, если последняя поездка на сервер завершилась сбоем, а не умерла, если последняя поездка завершилась успешно.

Замечания

Если подключение было потеряно (сообщается через SQL_ATTR_CONNECTION_DEAD), диспетчер драйверов ODBC будет уничтожить это подключение, вызвав SQLDisconnect в драйвере. Новые запросы на подключение могут не находить доступные для использования подключения в пуле. В конечном итоге диспетчер драйверов может создать новое подключение, если пул пуст.

Чтобы использовать пул подключений, приложение выполняет следующие действия.

  1. Позволяет пулу подключений путем вызова SQLSetEnvAttr задать для атрибута среды SQL_ATTR_CONNECTION_POOLING значение SQL_CP_ONE_PER_DRIVER или SQL_CP_ONE_PER_HENV. Этот вызов необходимо выполнить, прежде чем приложение выделяет общую среду, для которой необходимо включить пул подключений. Дескриптор среды в вызове SQLSetEnvAttr должен иметь значение NULL, что делает SQL_ATTR_CONNECTION_POOLING атрибут уровня процесса. Если для атрибута задано значение SQL_CP_ONE_PER_DRIVER, для каждого драйвера поддерживается один пул подключений. Если приложение работает со многими драйверами и несколькими средами, это может быть более эффективным, так как может потребоваться меньшее количество сравнений. Если задано значение SQL_CP_ONE_PER_HENV, для каждой среды поддерживается один пул подключений. Если приложение работает со многими средами и несколькими драйверами, это может оказаться более эффективным, так как может потребоваться меньше сравнений. Подключение пул отключен, задав SQL_ATTR_CONNECTION_POOLING значение SQL_CP_OFF.

  2. Выделяет среду путем вызова SQLAllocHandle с аргументом HandleType , равным SQL_HANDLE_ENV. Среда, выделенная этим вызовом, будет неявной общей средой, так как пул подключений включен. Однако используемая среда не определяется, пока SQLAllocHandle с помощью HandleType SQL_HANDLE_DBC вызывается в этой среде.

  3. Выделяет подключение путем вызова SQLAllocHandle с параметром InputHandle, равным SQL_HANDLE_DBC, а для дескриптора среды, выделенного для пула подключений, задано значение InputHandle. Диспетчер драйверов пытается найти существующую среду, которая соответствует атрибутам среды, заданным приложением. Если такая среда не существует, создается один из них с числом ссылок (поддерживается диспетчером драйверов) 1. Если найдена соответствующая общая среда, среда возвращается приложению, а ее количество ссылок увеличивается. (Фактическое подключение, которое будет использоваться, не определяется диспетчером драйверов, пока Вызывается SQL Подключение или SQLDriver Подключение.)

  4. Вызывает SQL Подключение или SQLDriver Подключение для подключения. Диспетчер драйверов использует параметры подключения в вызове SQL Подключение (или ключевое слово подключения в вызове SQLDriver Подключение) и атрибуты подключения, заданные после выделения подключения, чтобы определить, какое соединение в пуле следует использовать.

    Примечание.

    Как запрошенное подключение сопоставляется с пулом подключения, определяется атрибутом среды SQL_ATTR_CP_MATCH. Дополнительные сведения см. в разделе SQLSetEnvAttr.

    Приложения ODBC, использующие пул подключений, должны вызывать CoInitializeEx во время инициализации приложений и CoUninitialize при закрытии приложения.

  5. Вызывает SQLDisconnect при завершении подключения. Подключение возвращается в пул подключений и становится доступным для повторного использования.

Подробное обсуждение см. в разделе "Пул" в компонентах Доступа к данным Майкрософт.

Рекомендации по пулу Подключение

Выполнение любого из следующих действий с помощью команды SQL (а не через API ODBC) может повлиять на состояние подключения и вызвать непредвиденные проблемы при активном пуле подключений:

  • Открытие подключения и изменение базы данных по умолчанию.

  • Использование инструкции SET для изменения любых настраиваемых параметров (включая SET ROWCOUNT, ANSI_NULL, IMPLICIT_TRANSACTIONS, SHOWPLAN, STATISTICS, TEXTSIZE и DATEFORMAT).

  • Создание временных таблиц и хранимых процедур.

Если какие-либо из этих действий выполняются за пределами API ODBC, следующий пользователь, использующий подключение, автоматически наследует предыдущие параметры, таблицы или процедуры.

Примечание.

Не ожидайте, что определенные параметры будут присутствовать в состоянии подключения. Всегда следует задать состояние подключения в приложении и убедиться, что приложение удаляет все неиспользуемые параметры пула подключений.

Организация пулов соединений с учетом драйвера

Начиная с Windows 8 драйвер ODBC может использовать подключения в пуле более эффективно. Дополнительные сведения см. в разделе "Драйвер с учетом Подключение пулов".

См. также

Подключение к источнику данных или драйверу
Разработка драйвера ODBC
Пул в компонентах Microsoft Data Access