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

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

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

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

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

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

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

Итак, я ищу некоторую опцию на «локальной» стороне ссылки на базу данных, какой тип устанавливает тайм-аут для запросов по ссылкам базы данных.
Некоторое решение вроде alter session set xyz или select ... from [email protected] "wait 100" --(yes, I know this syntax doesn't exist) будет оценил, поскольку у меня нет прав DBA для этих конкретных БД.

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

11 голосов | спросил GWu 24 J000000Tuesday12 2012, 19:44:11

2 ответа


4

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

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

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

ответил 24 J000000Tuesday12 2012, 22:40:07
0

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

ALTER SESSION CLOSE DATABASE LINK dblink;

Вы можете, конечно, опросить удаленный сервер, прежде чем:

select * from [email protected]

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

ответил sandman 11 J000000Wednesday18 2018, 15:08:53

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132