【问题标题】:How to create a "singleton" scheduled job in oracle?如何在 oracle 中创建“单例”计划作业?
【发布时间】:2010-11-05 19:47:47
【问题描述】:

这可能只是我缺少的词汇来了解如何做到这一点:

计划每 5 分钟定期运行一次的作业,但要跟踪它永远不会同时运行两个实例,即如果前一个运行时间超过 5 分钟,则下一个实例将被推迟或跳过。

实现这一目标的最简单/最优雅的方法是什么?

【问题讨论】:

    标签: sql oracle plsql dbms-scheduler dbms-job


    【解决方案1】:

    来自 Oracle 10g 管理员指南:

    “DBMS_JOB 包已被DBMS_SCHEDULER 包取代。特别是,如果您正在管理作业以管理系统负载,则应考虑通过撤销用户的包执行权限来禁用 DBMS_JOB。”

    DBMS_SCHEDULER 是 Oracle 现在推荐的执行此操作的方法。它的一个优点是,如果您使用它,您可以通过 Enterprise Manager/Grid Control 管理您的工作。

    【讨论】:

    【解决方案2】:

    DBMS_JOB 负责处理。随便用吧。

    【讨论】:

    • +1 表示不重新发明轮子。此外,如果您需要确定上次/下次运行信息,请查看 DBA_JOBS 和 DBA_JOBS_RUNNING 视图。
    • 非常感谢您的回复。它是否也避免同时运行两个作业实例?如果是,我应该使用哪个选项?这是我还没有找到的...
    • IIRC,dbms_job 一次只能运行一个(您不会运行两个作业实例)。 Dbms_scheduler 允许更大的灵活性来处理作业失败。
    【解决方案3】:

    dbms_scheduler 在 dbms_job 之上的另一个优势是您可以更好地控制负载、资源使用,并且您还可以在数据库外部运行作业。

    hth, 罗纳德。

    【讨论】:

      【解决方案4】:

      如果由于某种原因 dbms_job 或 dbms_scheduler 对您不起作用,您还可以使用 DBMS_APPLICATION_INFO.SET_APPLICATION_INFO 设置您的作业的模块名称,您可以查询 v$session 以查看当前有多少会话正在执行该模块。

      这是什么类型的工作? PL/SQL 存储过程?

      【讨论】:

      • 感谢您的回复,我认为 dbms_job 和 dmbs_scheduler 都适合我,但不知何故,我似乎不够聪明,无法弄清楚如何避免两个工作重叠......
      • 顺便说一句:这是一个存储过程,是的
      • 您无需担心工作重叠。两种调度机制一次只能运行一个作业实例。
      • -1 抱歉,这行不通 - 在您查询 v$session 和调用 SET_APPLICATION_INFO 之间的时间里,没有什么可以阻止另一个进程做同样的事情 - 你仍然会结束具有相同 APPLICATION_INFO 的多个会话。如果 dbms_job/dbms_scheduler 没有切断它,DBMS_LOCK 确实提供了一种创建锁的方法。
      • 是的,这在并发量很大的情况下效果不佳,但是如果像提问者所说的那样每5分钟调用一次作业,我认为这不是问题。跨度>
      猜你喜欢
      • 2013-01-03
      • 2010-09-19
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2023-01-27
      相关资源
      最近更新 更多