Oracle Задание DBMS_SCHEDULER для мониторинга DBMS_ALERT - PullRequest
0 голосов
/ 19 апреля 2020

Env: Oracle 12 c R2

Попытка понять, каков наилучший подход к настройке задания Oracle DBMS_SCHEDULER, которое будет использоваться для мониторинга триггера DBMS_ALERT, который проверяет, когда Speci c изменения значения столбца в таблице.

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

У меня есть триггер, и у меня есть процедура с именем check_signal, которая проверяет сигнал, который я sh должен использовать в задании DBMS_SCHEDULER.

Цель, которую я пытаюсь достичь, состоит в том, чтобы у меня возникла ситуация, когда мне нужно будет выполнить, скажем, три задания:

Job1
Job2
Job3

Дело в том, что полезная нагрузка, возвращаемая с Job1, требуется и передается в качестве параметров в Job2, и снова полезная нагрузка, возвращаемая из Job2, является обязательной и передается в качестве параметров в Job3.

Именно этот wait / ale Это то, чего я пытаюсь достичь с помощью DBMS_ALERTS.

create or replace trigger my_tab_upd after update of status on my_tab for each row
begin
   dbms_alert.signal('mystatusalert', 'changed from '||:old.status||' to '||:new.status||'.');
end;
/

Это будет использоваться через веб-приложение, которое используется несколькими пользователями.

Просто не знаете, как настройте это запланированное задание, которое будет постоянно проверять оповещение и затем использоваться в веб-приложении.

Если есть способ лучше, чем DBMS_ALERT, пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 19 апреля 2020

Общий ответ прост, в то время как опрашивает события каждые N секунд , вы получаете средняя задержка N / 2 секунды и максимальная задержка N секунд .

В контексте DBMS_ALERT вам следует переосмыслить этот подход, поскольку он будет реализовывать опрос с ожиданием события .

Периодически выполняемые задания заставляют думать, в основном:

  • DBMS_ALERT.REGISTER для имени события

  • ожидание с DBMS_ALERT.WAITONE

Предположим, что задания DBMS_SCHEDULER выполняются каждые 10 секунд, и он запускается в фазе с частой сигнализацией. Таким образом, первое выполнение быстро возвращается после получения события.

Второе выполнение выпадает на период ожидания, поэтому задание будет ждать часа, чтобы получить событие .

I думаю, что это не то, что вы ожидаете, поскольку

1) ожидающее задание будет иметь открытую сессию - чего вы хотите избежать, как следует из другого вопроса

Вы можете использовать timeout = 0 в DBMS_ALERT.WAITONE, но это будет возвращать близко к отсутствию событий, кроме тех, которые произошли случайно между REGISTER и WAITONE

2), если в первом 10 секунд сигнализируются два события, второе будет потеряно, так как во время сигнализации задание на подписку неактивно и регистрация не существует.

...