НЕАКТИВНЫЙ параметр тайм-аута в Oracle

Мы застреваем в ситуации, где один из наших процессов занимает 3 часа вычислений, не касаясь базы данных. Соединение, которое было взято прежде, чем назвать процесс, закрывается сервером Oracle и любым последующим запросом, или фиксация выдает закрытое исключение соединения.

Кажется нам, что проблема связана с Oracle, закрывающей соединение, которое неактивно для этого долго по некоторым причинам.

Мы пытались изменить EXPIRE_TIMEOUT в sqlnet.ora, но это не помогло также.

Что мы можем сделать для разрешения этой проблемы?

8
задан Peter Mortensen 27 December 2009 в 22:55
поделиться

3 ответа

Что за ошибка при попытке использовать соединение?

Oracle по умолчанию не закроет соединение из-за неактивности. Вы можете настроить профиль с IDLE_TIME, чтобы Oracle закрывал неактивные соединения, но это не похоже на то, что Вы это сделали. Вы также можете настроить Oracle на обнаружение неактивных соединений и закрытие соединения, если клиент не отвечает... Если клиент похоронен в течение трех часов, возможно, что он не отвечает вовремя. Но это кажется менее вероятным, что реклама требует дополнительных шагов настройки.

Более вероятная ситуация, по моему опыту, заключается в том, что ваша сеть разрывает соединение. Если вы подключаетесь, например, через брандмауэр, то брандмауэр будет часто закрывать соединения, которые простояли слишком долго.

В реальном сообщении об ошибке Oracle, которое вы получаете, будет указано, какой из этих вариантов вызывает у вас проблему.

.
8
ответ дан 5 December 2019 в 12:59
поделиться

Irfan,

  1. Убедитесь, что в файле init.ora есть resource_limit=TRUE, чтобы изменения вступили в силу.

  2. Также проверьте, назначен ли пользователь, для которого вы пытаетесь установить лимит, профилю по умолчанию.

выберите профиль из dba_users, где имя пользователя = 'TEST_USER';
 ПРОФИЛЬ1

выберите профиль, имя_ресурса, предел. из dba_profiles, где профиль='ПРОФИЛЬ1' и
resource_name ='IDLE_TIME'

3 Если пользователь подписан на пользовательский профиль, убедитесь, что параметры пользовательского профиля заданы в соответствии с ним. Вам также следует обратить внимание на параметр connect_time (по умолчанию или пользовательский профиль, в зависимости от того, какой из них к вам применим. После превышения времени соединения соединение прерывается . )

И, наконец, обратите внимание, что если текущая сессия была начата до установки параметра, то она не вступит в силу. Изменения вступают в силу только со следующей сессии после внесения изменений.

Полезные ссылки.

http://www.adp-gmbh.ch/blog/2005/april/17.html
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:453256655431

Спасибо,

Раджеш

.
4
ответ дан 5 December 2019 в 12:59
поделиться

Независимо от того, какую базу данных вы используете, плохая идея предполагать, что ваше соединение будет работать, когда вы захотите его использовать. Один из способов справиться с этим - создать функцию для возврата активного соединения к рассматриваемой БД и вызывать ее каждый раз, когда вам нужен хэндл/объект/что бы то ни было для данной БД. В рутине поддерживается список баз данных и связанных с ними объектов подключения. Если объект соединения активен, когда функция вызывается, то все в порядке, и объект возвращается после того, как функция что-то делает с ним, чтобы убедить БД оставить хэндл/объект/все, что бы ни было открыто. Если нет живого объекта соединения, рутина открывает новый и возвращает его. Полезно иметь вторую рутину, которая располагается на таймере, срок действия которого истекает через 1 минуту или около того. Когда таймер истекает и называется вторая рутина, она просматривает список подключений к базе данных, ищет те, которые не активны в течение заданного времени (что-то значительно меньшее, чем значение таймаута сессии в базе данных). Те, которые были неактивны слишком долго, закрываются и очищаются.

.
0
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: