Мы застреваем в ситуации, где один из наших процессов занимает 3 часа вычислений, не касаясь базы данных. Соединение, которое было взято прежде, чем назвать процесс, закрывается сервером Oracle и любым последующим запросом, или фиксация выдает закрытое исключение соединения.
Кажется нам, что проблема связана с Oracle, закрывающей соединение, которое неактивно для этого долго по некоторым причинам.
Мы пытались изменить EXPIRE_TIMEOUT в sqlnet.ora, но это не помогло также.
Что мы можем сделать для разрешения этой проблемы?
Что за ошибка при попытке использовать соединение?
Oracle по умолчанию не закроет соединение из-за неактивности. Вы можете настроить профиль с IDLE_TIME, чтобы Oracle закрывал неактивные соединения, но это не похоже на то, что Вы это сделали. Вы также можете настроить Oracle на обнаружение неактивных соединений и закрытие соединения, если клиент не отвечает... Если клиент похоронен в течение трех часов, возможно, что он не отвечает вовремя. Но это кажется менее вероятным, что реклама требует дополнительных шагов настройки.
Более вероятная ситуация, по моему опыту, заключается в том, что ваша сеть разрывает соединение. Если вы подключаетесь, например, через брандмауэр, то брандмауэр будет часто закрывать соединения, которые простояли слишком долго.
В реальном сообщении об ошибке Oracle, которое вы получаете, будет указано, какой из этих вариантов вызывает у вас проблему.
.Irfan,
Убедитесь, что в файле init.ora есть resource_limit=TRUE, чтобы изменения вступили в силу.
Также проверьте, назначен ли пользователь, для которого вы пытаетесь установить лимит, профилю по умолчанию.
выберите профиль из 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
Спасибо,
Раджеш
.Независимо от того, какую базу данных вы используете, плохая идея предполагать, что ваше соединение будет работать, когда вы захотите его использовать. Один из способов справиться с этим - создать функцию для возврата активного соединения к рассматриваемой БД и вызывать ее каждый раз, когда вам нужен хэндл/объект/что бы то ни было для данной БД. В рутине поддерживается список баз данных и связанных с ними объектов подключения. Если объект соединения активен, когда функция вызывается, то все в порядке, и объект возвращается после того, как функция что-то делает с ним, чтобы убедить БД оставить хэндл/объект/все, что бы ни было открыто. Если нет живого объекта соединения, рутина открывает новый и возвращает его. Полезно иметь вторую рутину, которая располагается на таймере, срок действия которого истекает через 1 минуту или около того. Когда таймер истекает и называется вторая рутина, она просматривает список подключений к базе данных, ищет те, которые не активны в течение заданного времени (что-то значительно меньшее, чем значение таймаута сессии в базе данных). Те, которые были неактивны слишком долго, закрываются и очищаются.
.