【问题标题】:Waiting for a submitted job to finish in Oracle PL/SQL?等待提交的作业在 Oracle PL/SQL 中完成?
【发布时间】:2011-01-04 23:51:15
【问题描述】:

我正在寻找 PL/SQL 中 Java 的 thread.join() 的等价物。 IE。我想启动一些工作(线程),然后等待它们完成。

这在 PL/SQL 中怎么可能?

我正在考虑使用 dbms_job.submit(我知道它已被弃用)。 dbms_scheduler 也是一种选择。

我的代码:

DECLARE
  jobno1 number;
  jobno2 number;
BEGIN

  dbms_job.submit(jobno1,'begin dbms_lock.sleep(10); dbms_output.put_line(''job 1 exit'');end;');
  dbms_job.submit(jobno2,'begin dbms_lock.sleep(10); dbms_output.put_line(''job 2 exit'');end;');

  dbms_job.run(jobno1);
  dbms_job.run(jobno2);

  //Need code to Wait for jobno1 to finish
  //Need code to Wait for jobno2 to finish

END;

【问题讨论】:

    标签: multithreading oracle plsql


    【解决方案1】:

    这是使用DBMS_SCHEDULER 作业调度中的链完成的。 Oracle Documentation 有一些例子可以完成你想要的。基本上,您使用执行结构定义步骤、一小部分代码。在您的示例中,您的第一步是开始步骤(通常会进行初始化),然后您将有两个并行运行的步骤(jobno1 和 jobno2),然后是两个并行作业完成后将激活的最后一步.

    【讨论】:

    • +1,很好,我不知道 dbms_scheduler 中的链接能力......虽然我仍然不确定如何等待最后两个步骤(并行运行)在我之前完成阻止我完成。
    【解决方案2】:

    我喜欢 Adam Hawkes 提出的使用 DBMS_SCHEDULER 链的解决方案。不知道,因为我还在使用 DBMS_JOB,还没有重写代码。

    无论如何...我目前使用的解决方案是 DBMS_JOB(尽管您可能应该使用 DBMS_SCHEDULER,因为 DBMS_JOB 已被弃用)和 DBMS_ALERT。

    作业是使用 DBMS_JOB 创建的。然后我们使用 dbms_alert.register 和 dbms_alert.waitany 等待作业完成。每个作业在完成时都使用 dbms_alert.signal。如果工作完成并在父母准备好之前发出信号,可能会出现问题,但我相信你可以解决这个问题。

    我猜 DBMS_SCHEDULER 链可能是您现在应该这样做的方式,但我只是为了完整性添加我的答案。

    【讨论】:

    • 如果您仍在使用DBMS_JOB 而不是DBMS_SCHEDULER,这也是一个同样好的解决方案!
    • +1,好主意..关于我将如何等待 2 个作业完成的任何想法(就像您提到的那样,在调用 waitany 步骤之前,作业有可能完成)。我能想到的一种解决方案是让两个作业都抛出相同的事件,然后捕获它两次......替代方案?
    • @vicjugador:简短的回答是,在创建作业时,我们向集合添加一个标识符(标识符是使用DBMS_RANDOM 创建的)。然后,当作业返回信号时,我们将其从集合中删除。一旦集合为空,我们继续。不过,可能有更好的方法来处理这个问题。您可以假设您已经创建了 2 个工作并收到了 2 个信号,这样您就完成了。
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多