【问题标题】:Oracle DBMS_SCHEDULER job to monitor a DBMS_ALERT用于监视 DBMS_ALERT 的 Oracle DBMS_SCHEDULER 作业
【发布时间】:2020-04-20 06:23:23
【问题描述】:

环境:Oracle 12c R2

试图了解设置 Oracle DBMS_SCHEDULER 作业的最佳方法是什么,该作业将用于监视 DBMS_ALERT 触发器,该触发器检查表中特定列值何时发生变化。

问题是,此表列值更改有时会频繁发生,有时可能一天只发生两次,但我需要通过 DBMS_ALERT 监视此列更改。

我的触发器如下,我有一个名为check_signal 的过程,用于检查我希望在 DBMS_SCHEDULER 作业中使用的信号。

我要实现的目标是我将面临需要运行三份工作的情况:

Job1
Job2
Job3

问题是,从Job1 返回的有效负载是必需的,并作为参数传递给Job2,同样,从 Job2 返回的有效负载也是必需的,并作为参数传递给Job3

我试图通过使用 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 更好的方法,请告诉我。

【问题讨论】:

    标签: oracle plsql notifications oracle12c


    【解决方案1】:

    一般的答案很简单,而每 N 秒轮询一次事件您会得到平均延迟 N/2 秒和最大延迟 N 秒

    DBMS_ALERT 的上下文中,您应该重新考虑这种方法,因为这将实现轮询并等待事件

    周期性执行的作业基本上是这样认为的:

    • DBMS_ALERT.REGISTER 在事件名称上

    • 等待DBMS_ALERT.WAITONE

    假设 DBMS_SCHEDULER 作业每 10 秒运行一次,并在频繁发出信号的阶段启动。所以第一次执行收到事件后很快返回。

    第二次执行属于相当时期,因此作业将等待数小时以获取事件

    我认为这不是你所期望的

    1) 等待的工作将有一个开放的会话 - 你想避免的事情如下you other question

    您可以在DBMS_ALERT.WAITONE 中使用timeout = 0,但这将几乎不返回任何事件,除了在REGISTERWAITONE 之间意外触发的事件

    2) 如果在前 10 秒内发出两个事件的信号,则第二个事件将丢失,因为在发出信号时,订阅作业未处于活动状态且不存在注册。

    【讨论】:

    • 欣赏响应,似乎 DBMS_ALERT 不是最好的方法。我已经更新了我的原始帖子以显示我想要实现的确切场景,re: Job1、Job2 和 Job3。希望有任何其他可能的解决方案/建议。
    • 我最后的建议@tonyf 不要让网络应用程序的人问他们如何查询数据库中的更改;问他们如何将数据库中的更改发布给他们。
    • 感谢您的建议。只是为了我的理解,你能否扩展这个过程,即你如何向他们发布数据库的更改 - 因为我现在肯定会考虑这种方法,我不完全确定如何处理这个。
    猜你喜欢
    • 2018-02-17
    • 2014-11-24
    • 2021-01-21
    • 2021-10-31
    • 2016-10-09
    • 2017-02-22
    • 2020-07-31
    • 2015-06-07
    • 2012-01-20
    相关资源
    最近更新 更多