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 это поведение больше не наблюдалось, и пул соединений работает отлично.