Организация пулов соединений OLE DB, ODBC и Oracle (ADO.NET)
Организация пулов соединений может существенно улучшить производительность и масштабируемость приложения. В этом разделе обсуждаются пулы соединений поставщиков данных .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 в библиотеке MSDN.
Пулы соединений для Odbc
Пулы соединений поставщика данных .NET Framework для ODBC управляются диспетчером драйверов ODBC для этого соединения и не зависят от поставщика данных .NET Framework для ODBC.
Чтобы включить или отключить пулы соединений, откройте диалоговое окно Администратор источников данных ODBC в папке «Администрирование» или панели управления. На вкладке Организация пулов соединений можно задать параметры пулов соединений для каждого установленного драйвера ODBC. Обратите внимание, что изменения, произведенные в пуле соединений для конкретного драйвера ODBC, влияют на все приложения, использующие этот драйвер ODBC.
Дополнительные сведения о пулах соединений ODBC см. в разделе ИНФО. Часто задаваемые вопросы о пулах соединений ODBC в библиотеке MSDN.
Пулы соединений для OracleClient
Поставщик данных .NET Framework для Oracle автоматически поддерживает пулы соединений для клиентского приложения ADO.NET. Для управления пулами соединений можно также указать несколько модификаторов строки соединения (см. подраздел «Управление пулами соединений с помощью ключевых слов строки соединения» ниже в этом разделе).
Создание и назначение пулов
При открытии соединения создается пул соединений на основе существующего алгоритма сопоставления, связывающего этот пул со строкой соединения. Каждый пул соединений связывается с отдельной строкой соединения. При открытии нового соединения, если строка соединения не соответствует в точности существующему пулу, создается новый пул.
После создания пулы соединений не освобождаются, пока не завершится активный процесс. На поддержку неактивных или пустых пулов затрачивается очень мало системных ресурсов.
Добавление соединения
Пул соединений создается для каждой уникальной строки соединения. При создании пула создается множество объектов соединения, которые добавляются в пул для удовлетворения требования к минимальному размеру пула. Соединения добавляются в пул по мере надобности, пока не будет достигнут максимальный размер пула.
Когда запрашивается объект OracleConnection, он извлекается из пула при наличии подходящего соединения. Соединение считается подходящим, если оно в настоящий момент не используется, имеет соответствующий контекст транзакции или не связано с каким-либо контекстом транзакции, а также имеет допустимую ссылку на сервер.
Если достигнут максимальный размер пула, а пригодные соединения недоступны, запрос помещается в очередь. Средство управления пулом соединений обрабатывает эти запросы, перераспределяя соединения по мере их освобождения. Соединения освобождаются обратно в пул при закрытии или ликвидации.
Удаление соединений
Средство управления пулом соединений удаляет соединение из пула после длительного бездействия соединения, или если обнаруживает, что соединение с сервером разорвано. Обратите внимание, что это можно определить только при попытке связаться с сервером. При обнаружении соединения, которое больше не имеет связи с сервером, оно помечается как недействительное. Средство управления пулом соединений периодически просматривает пулы соединений в поиске объектов, освобожденных в пул и маркированных как недопустимые. Эти соединения удаляются.
Если существует соединение с пропавшим сервером, его можно извлечь из пула, если организатор пулов соединений не обнаружил разрыва соединения и не отметил его как недействительное. Если это происходит, вызывается исключение. Однако чтобы освободить соединение обратно в пул, его нужно закрыть.
В методе Finalize вашего класса нельзя вызывать методы Close или Dispose объектов Connection, DataReader или любого другого управляемого объекта. В методе завершения следует только освобождать неуправляемые ресурсы, которыми ваш класс непосредственно владеет. Если класс не владеет какими-либо неуправляемыми ресурсами, не включайте в его определение метод Finalize. Дополнительные сведения см. в разделе Сборка мусора.
Поддержка транзакций
Соединения выбираются из пула и назначаются в зависимости от контекста транзакции. Контексты запрашивающего потока и назначенного соединения должны совпадать. Поэтому каждый пул соединений в действительности делится на соединения, не имеющие связанного с ними контекста транзакции, и на N подразделов, каждый из которых содержит соединения с определенным контекстом транзакции.
При закрытии соединения оно освобождается обратно в пул и в соответствующий подраздел в зависимости от его контекста транзакции. Поэтому можно закрыть соединение без создания ошибки, даже если распределенная транзакция все еще находится в ожидании. Это позволяет позднее зафиксировать или прервать распределенную транзакцию.
Управление пулами соединений с помощью ключевых слов строки соединения
Свойство ConnectionString объекта OracleConnection поддерживает пары «ключ-значение» строки соединения, с помощью которых можно изменять логику организации пулов соединений.
В следующей таблице приводятся значения ConnectionString, которые можно использовать для настройки пулов соединений.
Имя |
Значение по умолчанию |
Описание |
---|---|---|
Connection Lifetime |
0 |
Если соединение возвращается в пул, время его создания сравнивается с текущим временем и соединение уничтожается, если этот промежуток времени (в секундах) превышает значение, заданное параметром Connection Lifetime. Эта возможность полезна в кластеризованных конфигурациях для принудительной балансировки нагрузки между выполняющимся сервером и сервером, только что переведенным в оперативный режим. Значение ноль (0) означает максимальное время ожидания для соединений в пуле. |
Enlist |
'true' |
При значении true средство управления пулом автоматически прикрепляет соединение к текущему контексту транзакции потока создания, если контекст транзакции существует. |
Max Pool Size |
100 |
Максимальное число разрешенных соединений в пуле. |
Min Pool Size |
0 |
Минимальное число поддерживаемых соединений в пуле. |
Pooling |
'true' |
При значении true соединение извлекается из соответствующего пула или при необходимости создается и добавляется в соответствующий пул. |
См. также
Основные понятия
Счетчики производительности (ADO.NET)