Есть ли тайм-аут для запроса по ссылке в базе данных?

11

Изменить / Предисловие: Этот вопрос был перенесен из SO, так как меня особенно интересует вопрос о тайм-аутах при запросах ссылок на БД. Предоставленный обходной путь от SO несколько нормальный, но мне действительно интересен сам вопрос.

Мотивация:
у меня был один запрос, выполняемый «навсегда» (более 2 дней, пока я не завершил сеанс), который использовал ссылку на базу данных. Проблема, казалось, ORA-02068заключалась в том, что удаленная база данных стала недоступной и по какой-то пока еще неизвестной причине не было поднято (не обсуждаться здесь), а запрос просто ждал и ждал.

(Запрос выдается заданием dbms_scheduler, которое выполняет процедуру в пакете PL / SQL. Как следствие, задание также зависло. Но это не представляет особого интереса для сути этого вопроса)

Я смоделировал эту ситуацию, переведя одну из моих тестовых БД в режим ожидания и запросив ее по ссылке в базе данных. Как и ожидалось, запрос находился в ожидании, пока он не будет отменен вручную или удаленная БД не будет приостановлена.

Вопрос:
У меня нет контроля над поведением и временем работы удаленной базы данных, поэтому я нахожусь в поиске некоторой возможности установить тайм-аут для запроса, использующего ссылку на базу данных.

Я уже изучил профили (и CPU_PER_CALLт. Д.), sqlnet.oraПараметры, добавляя локальные параметры именования непосредственно в строку подключения (например, добавляя (connect_timeout=10)в определение ссылки на базу данных), выполняя команду с ... for update wait 1, но они либо работают для занятых или незанятых сеансов, но не для сессий в ожидании.

Поэтому я нахожусь в поиске некоторого параметра на «локальной» стороне ссылки на базу данных, который устанавливает тайм-аут для запросов по ссылкам базы данных.
Некоторое решение, как alter session set xyzили select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)было бы оценено, так как у меня нет прав администратора этих конкретных баз данных.

В настоящее время я использую 10gR2, но через несколько недель обновлюсь до 11gR2, поэтому идеи для любой из этих версий будут полезны.

GWu
источник
как используется запрос? часть более крупной процедуры / пакета, лежащего в основе SQL для просмотра матов, запускаемого из внешнего приложения, ...? Я не знаю простого синтаксиса "wait xxx", возможно, ваше решение должно быть частью более крупной программы, в зависимости от вашего использования.
Запрос выдается заданием dbms_scheduler, которое выполняет процедуру в пакете PL / SQL. (обновленный вопрос с этим)
GWu

Ответы:

4

Поскольку вы используете dbms_scheduler, вы можете установить для атрибута max_run_duration задание некоторого предела, а затем отправить по электронной почте планировщик, если это событие возникнет. За кулисами Oracle использует таблицы очередей (которые могут позволить вам создавать задания, которые запускаются при возникновении события , если вы хотите предпринять дополнительные шаги для большей автоматизации вашего ответа). Но в основном любое задание, которое выполняется с установленной вами max_run_duration, будет вызывать тип события: JOB_OVER_MAX_DUR

Кусок электронной почты построен в 11gr2, смотрите здесь для хорошей рецензии.

Надеюсь, это поможет.


источник
отличная идея, спасибо! Это не совсем ответ на конкретный вопрос о тайм-ауте в ссылках на БД, но я думаю, это решит мою первоначальную проблему, так что +1 :-). Я не знал о max_run_duration и, начиная с этого, я просто нашел, как остановить и отбросить зависшую работу ( forums.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWu
По какой-то причине я не могу max_run_durationподнять мероприятие, поэтому я здесь
GWu
0

Я не говорю, что у меня есть решение, но я также хотел бы больше обсудить, как контролировать время ожидания dblink. Я полагаю, что можно было бы написать код, который запускает событие или ожидает события тайм-аута TNS, а затем выполняет:

ALTER SESSION CLOSE DATABASE LINK dblink;

Конечно, вы можете опрашивать удаленный сервер раньше с помощью:

select * from dual@dblink

проверить, доступен ли он, но это не решает проблему слишком долгого выполнения кода на пульте. Плохой удаленный код должен вызывать события ожидания, поэтому я предполагаю, что они могут быть перехвачены (даже на уровне класса в 12c). Это все еще не дает нам элегантного решения для принудительного завершения сеанса dblink.

Дрема
источник