Пул подключений OLE DB, ODBC и Oracle

Организация пулов соединений может существенно улучшить производительность и масштабируемость приложения. В этом разделе описывается пул подключений для поставщиков данных платформа .NET Framework для OLE DB, ODBC и Oracle.

OleDb

Поставщик данных .NET Framework для OLE DB автоматически создает пулы соединений, используя пулы сеанса OLE DB. Аргументы строки соединения могут использоваться для включения или отключения служб OLE DB, включая службы пулов. Например, следующая строка соединения отключает пулы сеанса OLE DB и автоматическое прикрепление транзакций.

Provider=SQLOLEDB;OLE DB Services=-4;Data Source=localhost;Integrated Security=SSPI;

Рекомендуется всегда закрывать или удалять соединение при завершении работы, чтобы вернуть его в пул. Соединения, которые явно не закрыты, нельзя вернуть в пул. Например, соединение, которое вышло за пределы области, но явно закрыто не было, будет возвращено в пул соединений только в том случае, если был достигнут максимальный размер этого пула, а соединение еще действует.

Дополнительные сведения о сеансе ИЛИ пуле ресурсов OLE DB, а также об отключении пула путем переопределения по умолчанию службы поставщика OLE DB см. в руководстве программиста OLE DB.

ODBC

Пулы соединений поставщика данных .NET Framework для ODBC управляются диспетчером драйверов ODBC для этого соединения и не зависят от поставщика данных .NET Framework для ODBC.

Чтобы включить или отключить пул подключений, откройте источник данных ODBC Администратор istrator в папке Администратор istrative Tools панель управления. Вкладка Подключение пула подключений позволяет указать параметры пула подключений для каждого установленного драйвера ODBC. Подключение изменения пула для определенного драйвера ODBC влияют на все приложения, использующие этот драйвер ODBC.

OracleClient

Поставщик данных .NET Framework для Oracle автоматически поддерживает пулы соединений для клиентского приложения ADO.NET. Для управления пулами соединений можно также указать несколько модификаторов строки соединения (см. подраздел «Управление пулами соединений с помощью ключевых слов строки соединения» ниже в этом разделе).

Создание и назначение пулов

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

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

Добавление соединения

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

Когда запрашивается объект OracleConnection, он извлекается из пула при наличии подходящего соединения. Соединение считается подходящим, если оно в настоящий момент не используется, имеет соответствующий контекст транзакции или не связано с каким-либо контекстом транзакции, а также имеет допустимую ссылку на сервер.

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

Удаление соединений

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

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

В методе Close вашего класса нельзя вызывать методы Dispose или Connection объектов DataReader, Finalize или любого другого управляемого объекта. В методе завершения следует только освобождать неуправляемые ресурсы, которыми ваш класс непосредственно владеет. Если класс не владеет какими-либо неуправляемыми ресурсами, не включайте в его определение метод Finalize. Дополнительные сведения см. в статье Сборка мусора.

Поддержка транзакций

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

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

Управление пулом Подключение ion с помощью ключевых слов строки Подключение ion

Свойство ConnectionString объекта OracleConnection поддерживает пары «ключ-значение» из строки соединения, с помощью которых можно изменять логику организации пулов соединений.

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

Имя. По умолчанию. Description
Connection Lifetime 0 Если соединение возвращается в пул, время его создания сравнивается с текущим временем и соединение уничтожается, если этот промежуток времени (в секундах) превышает значение, заданное параметром Connection Lifetime. Эта возможность полезна в кластеризованных конфигурациях для принудительной балансировки нагрузки между выполняющимся сервером и сервером, только что переведенным в оперативный режим.

Значение ноль (0) означает максимальное время ожидания для соединений в пуле.
Enlist 'true' При значении true средство управления пулом автоматически прикрепляет соединение к текущему контексту транзакции потока создания, если контекст транзакции существует.
Max Pool Size 100 Максимальное число разрешенных соединений в пуле.
Min Pool Size 0 Минимальное число поддерживаемых соединений в пуле.
Pooling 'true' При значении true соединение извлекается из соответствующего пула или при необходимости создается и добавляется в соответствующий пул.

См. также