Мы используем последнюю официальную ODP.NET Managed (Опубликовано: 2015-10-14 | Версия: 12.1.2400) от Oracle до базы данных Oracle 12 (не RAC) конфигурации, и мы не можем поддерживать связь с базой данных более, чем обычно, < 3 минуты.ODP.NET Managed ConnectionPool закрывается/открывается каждые 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 минуты, и это не то, что мы ожидали.
У нас такое поведение как в webapp, использующем EF6 для DataAccess, так и в приложении, у которого нет ORM (просто старый SQL).
Согласно Oracle Documentation:
Соединительный сервис пулинговой закрывает соединение, когда они не используются; соединения закрываются каждые 3 минуты. Атрибут размера пула Decr свойства ConnectionString предоставляет службу объединения пулов для максимального количества соединений, которые могут быть закрыты каждые 3 минуты.
Для меня - до тех пор, пока соединение находится в пределах срока службы, в ConnectionPool должен быть ДОСТУП МИН БАССЕЙН действительного соединения в течение более длительного времени, чем 3 минуты.
У нас есть еще одно приложение, в котором используется драйвер Oracle Devart, и этот драйвер объединяет соединения, которые остаются живыми в течение длительного времени.
Неужели кто-то еще оценил это «неправильное поведение» ConnectionPool в управляемом драйвере ODP.NET и нашел решение? Или это может быть ошибка в ConnectionPool ODP.NET?
UPDATE 2016.01.27:
Я добавил демо-приложение на моем GitHub счет, чтобы продемонстрировать вопрос:
https://github.com/jonnybee/OraConnTest
Это просто приложение небольшие WinForms, где вы добавляете строку подключения и нажмите кнопку, чтобы запустить фоновый рабочий, который запускает «SELECT» OK «FROM DUAL» каждые 3 секунды.
Мое соединение содержит: POOLING = True, MAX POOL SIZE = 10; DECR POOL SIZE = 1; CONNECTION LIFETIME = 86400; INCR POOL SIZE = 1; MIN POOL SIZE = 5 + вы должны добавить USER ID, PASSWORD и ИСТОЧНИК ДАННЫХ.
Каждые 3 минуты вы увидите, что 5 существующих соединений закрыты и создано 5 новых соединений (настройка MIN POOL SIZE).
Выполнить это SQL, чтобы увидеть фактические соединения: выберите с.и.д., logon_time, prev_exec_start, wait_time_micro/1000 от $ сессии , где программа, как '% OraWinApp%' заказ по logon_time убыв
Хотя программа и perfmon работает, и вы увидите это поведение, когда старые соединения будут закрыты и будут созданы новые соединения с новым login_time.
В моем понимании, соединение объединение выполняются на стороне клиента (= водитель), и это применяя этот тип «жесткого сброса» в соединениях, поэтому теоретически у вас всегда есть размер «минимального пула», иногда по какой-то причине они сбрасываются. Другой драйвер просто этого не делает. Поскольку мы говорим об Oracle, я лично сомневаюсь, что вы можете изменить это поведение. Если это влияет на производительность для вас, используйте другой драйвер. Но я надеюсь, что кто-то более опытный приходит таким образом :) – Koshinae
Я не могу воспроизвести это. Я включаю счетчики ODP.NET и использую вашу строку подключения, я открываю 5 подключений, выполняю над ними работу и закрываю и удаляю их все, а затем отслеживаю счетчик HardDisconnectsPerSecond ODP.NET. Даже в течение 10 минут я не вижу Hard Disconnects. Вы делаете что-то другое, чем то, что я сделал? –
Смотрите мое обновление в OP. Я считаю, что вы должны постоянно работать, поскольку очистка пула соединений начинается, когда соединения возвращаются в пул. –