Пул подключений 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;

Внимание

Корпорация Майкрософт рекомендует использовать самый безопасный поток проверки подлинности. Если вы подключаетесь к SQL Azure, управляемые удостоверения для ресурсов Azure — это рекомендуемый метод проверки подлинности.

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

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

ODBC

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

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

OracleClient

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

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

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

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

Добавление подключения

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

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

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

Удаление подключения

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

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

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

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

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

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

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

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

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

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

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

См. также