ODP.NET Managed ConnectionPool закрывается / открывается каждые 3 минуты

Мы используем последнюю Официальную версию ODP.NET Managed (Опубликовано: 2015-10-14 | Версия: 12.1.2400) из Oracle в конфигурацию базы данных Oracle 12 (не RAC), и мы не можем поддерживать соединения с базой данных дольше, чем обычно < 3 минуты

Наша строка подключения указывает:

MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1;

и мы также пытались

CONNECTION LIFETIME=90000;MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1;

Когда мы используем PerfMon на сервере и наблюдаем за счетчиками для HardConnects/HardDisconnects, мы видим, что пул соединений закрывает и повторно открывает 5 соединений каждые 3 минуты, и это не то, что мы ожидали.

Такое поведение наблюдается как в веб-приложении, которое использует EF6 для DataAccess, так и в приложении, в котором нет ORM (просто старый SQL).

Согласно документации Oracle:

Служба пула соединений закрывает соединения, когда они не используются; соединения закрываются каждые 3 минуты. Атрибут Decr Pool Size свойства ConnectionString предоставляет сервис пула соединений для максимального количества соединений, которые могут быть закрыты каждые 3 минуты.

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

У нас есть другое приложение, которое использует драйвер Oracle Devart, и этот драйвер объединяет соединения, которые остаются живыми в течение длительного времени.

Кто-нибудь еще видел это "неправильное поведение" ConnectionPool в ODP.NET Managed Driver и нашел решение? Или это может быть ошибка в ConnectionPool ODP.NET Managed?

ОБНОВЛЕНИЕ 2016.01.27:

Я добавил демонстрационное приложение в свой аккаунт на github, чтобы продемонстрировать проблему:

https://github.com/jonnybee/OraConnTest

Это всего лишь небольшое приложение winforms, в котором вы добавляете строку подключения и нажимаете кнопку, чтобы запустить фоновый рабочий, который запускает "ВЫБРАТЬ" ОК "ИЗ ДВОЙНОГО" каждые 3 секунды.

Моя строка подключения содержит: POOLING=True;MAX POOL SIZE=10;DECR POOL SIZE=1;CONNECTION LIFETIME=86400;INCR POOL SIZE=1;MIN POOL SIZE=5 + необходимо добавить идентификатор пользователя, пароль и источник данных.

Каждые 3 минуты вы увидите, что 5 существующих подключений закрыты и создано 5 новых подключений (настройка MIN POOL SIZE).

Запустите этот SQL, чтобы увидеть фактические соединения: выберите sid, logon_time, prev_exec_start, wait_time_micro/1000 из v$session, где программа наподобие "%OraWinApp%" упорядочена по logon_time desc

Пока программа и perfmon запущены, вы увидите это поведение, когда старые соединения закрываются и создаются новые соединения с новым login_time.

2 ответа

Я согласен с вашей оценкой того, как это должно работать, но пул соединений в ODP.net немного странный. Ключевым моментом здесь является то, что время жизни соединения соблюдается только "когда приложение закрывает соединение", когда кажется, что размер пула decr имеет собственный поток. Я понятия не имею, почему они это сделали - проверка только при возврате пула создает senario, в котором вы можете извлечь из пула мертвое соединение (прерванное по тайм-ауту брандмауэра).

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

Единственное, что меня отталкивает, это то, что все 5 соединений закрыты - по умолчанию размер пула decr равен 1.

Мы столкнулись с тем же поведением при использовании пула соединений с ODP.Net. Соединения с базой данных, принадлежащие пулу, были закрыты и открывались каждые 3 минуты.

Оказалось, что причиной этого должна быть ошибка в NuGet-Package Oracle.ManagedDataAccess версии 12.1

После обновления NuGet-Packages до 12.2 это поведение больше не наблюдалось, и пул соединений работает отлично.

Другие вопросы по тегам