Основы проектирования приложений баз данных

       

Пул соединений


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

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

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

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

Пул соединений управляется менеджером драйверов. Соединение выбирается из пула при вызове приложением функции SQLConnect или функции SQLDriverConnect, а возвращается в пул при выполнении функции SQLDisconnect. Размер пула изменяется динамически: если соединение не было использовано в течение определенного периода времени, то оно удаляется из пула.

Используя атрибут SQL_ATTR_CONNECTION_DEAD в версии ODBC API 3.х, менеджер драйверов может определить состояние соединения из пула: значение SQL_CD_TRUE определяет, что соединение разорвано, а значение SQL_CD_FALSE означает, что соединение пока еще активно. При этом обычно для получения значения данного атрибута драйвер не обращается к серверу, а возвращает результат, основываясь на состоянии соединения при его последнем использовании.


Информация о том, будут ли предотвращены попытки драйвера менеджера установить соединение при включенном пуле соединений, сохраняется в реестре Windows в разделе:

HKEY_LOCAL_MACHINE\ Software\Odbc\Odbcinst.ini\ ODBC Connection Pooling\Retry Wait

Для использования приложением пула соединений следует:

  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 (отдельный пул соединений поддерживается для каждой среды).
  2. Создать дескриптор среды, вызвав функцию SQLAllocHandle со значением параметра типа дескриптора равным SQL_HANDLE_ENV. Созданная среда будет неявно разделяемой средой.
  3. Создать дескриптор соединения, вызвав функцию SQLAllocHandle со значением параметра типа дескриптора, равным SQL_HANDLE_DBC. Менеджер драйверов будет искать существующую разделяемую среду с соответствующими атрибутами среды (при нахождении требуемой среды она возвращается приложению и менеджер драйверов увеличивает значение счетчика на 1).Если такой среды нет, то менеджер драйверов создает ее и устанавливает значение счетчика равным 1.
  4. Для получения соединения из пула вызвать функцию SQLConnect или SQLDriverConnect. Менеджер драйверов использует значения параметров и значения атрибутов соединения для определения требуемого соединения из пула соединений. При этом учитывается значение атрибута SQL_ATTR_CP_MATCH (соответствие требуемого соединения соединению из пула).
  5. Для разрыва соединения вызвать функцию SQLDisconnect. При этом соединение возвращается обратно в пул и делается доступным для дальнейшего использования.


Для отключения режима пула соединений следует установить значение атрибута SQL_ATTR_CONNECTION_POOLING равным SQL_CP_OFF.


Содержание раздела