2016-01-22 10 views
5

Мы используем последнюю официальную 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.

+0

В моем понимании, соединение объединение выполняются на стороне клиента (= водитель), и это применяя этот тип «жесткого сброса» в соединениях, поэтому теоретически у вас всегда есть размер «минимального пула», иногда по какой-то причине они сбрасываются. Другой драйвер просто этого не делает. Поскольку мы говорим об Oracle, я лично сомневаюсь, что вы можете изменить это поведение. Если это влияет на производительность для вас, используйте другой драйвер. Но я надеюсь, что кто-то более опытный приходит таким образом :) – Koshinae

+0

Я не могу воспроизвести это. Я включаю счетчики ODP.NET и использую вашу строку подключения, я открываю 5 подключений, выполняю над ними работу и закрываю и удаляю их все, а затем отслеживаю счетчик HardDisconnectsPerSecond ODP.NET. Даже в течение 10 минут я не вижу Hard Disconnects. Вы делаете что-то другое, чем то, что я сделал? –

+0

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

ответ

0

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

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

Единственное, что бросает меня в том, что все 5 соединений закрыты - размер ОВЦСА пула по умолчанию 1.

+0

См. Мое приложение для обновления и примера. Я запустил пример приложения с MIN POOL SIZE = 0 и CONNNECTION LIFETIME = 86400 (= 24 часа), и даже с этими настройками и запуском SQL каждые 3 секунды пул соединений закроет это соединение каждые 3 минуты. Из того, что я вижу, ODP NET не соблюдает настройки DECR POOL SIZE и CONNECTION LIFETIME и позволяет поддерживать соединение только в том случае, если они заняты, когда выполняется очистка –