【问题标题】:Can We use threading in PL/SQL?我们可以在 PL/SQL 中使用线程吗?
【发布时间】:2010-10-09 06:34:58
【问题描述】:

PL/SQL 中有异步调用的特性吗? 假设我在一段代码中想多次调用一个过程,并且不关心该过程何时以及返回什么?

BEGIN
  myProc(1,100);
  myProc(101,200);
  myProc(201,300);
  ...
  ...

END;

在上述情况下,我不希望我的代码在执行 (101,200) 之前等待 myProc(1,100) 完成处理
谢谢。

【问题讨论】:

    标签: oracle asynchronous plsql


    【解决方案1】:

    此处显示了执行并行(多线程)PL/SQL 的另一种方法:

    http://www.williamrobertson.net/documents/parallel-plsql-launcher.html

    使用 dbms_job 或 dbms_schedular 的缺点是您不知道您的任务何时完成。我读到你不打扰,但也许你将来会改变主意。

    编辑:

    这篇文章http://www.devx.com/dbzone/10MinuteSolution/20902/0/page/1 描述了另一种方式。它使用dbms_jobdbms_alert。警报用于发出作业已完成的信号(回调信号)。

    【讨论】:

    • 使用 DBMS_Scheduler,您可以轻松地将调用包装在一个过程中执行调度程序链,该过程将检查链步骤的完成情况,并在链完成或失败时返回调用过程。跨度>
    【解决方案2】:

    从 11g 开始,您确实有另一个选择。 Oracle 引入了一个包,它的功能与您想做的类似,名为 DBMS_PARALLEL_EXECUTE

    根据他们的说法,“DBMS_PARALLEL_EXECUTE 包使用户能够以增量方式并行更新表数据”。如何使用它的一个相当好的总结是here

    基本上,您定义了 Oracle 应该用来将您的工作分解为多个部分的方式(在您的情况下,您似乎传递了一些关键值),然后它将单独启动每个部分。为了使用它,肯定需要一些计划和一些额外的编码,但无论如何你都不应该做任何事情。

    使用诸如此类的认可方法的优势在于,Oracle 甚至提供了可用于监控每个独立线程的数据库视图。

    【讨论】:

      【解决方案3】:

      askTom 在此处列出的并行流水线方法提供了一种更复杂的方法,但与 DBMS 作业技术不同,您实际上会暂停直到工作完成。也就是说,您确实要求使用“异步”技术,而 DBMS_JOB 非常适合。

      【讨论】:

        【解决方案4】:

        对于 PL/SQL 并行处理,您有以下选项:

        这些将让您“模拟”PL/SQL 中的分叉和线程。当然,使用这些,您可能会意识到需要在并行执行的程序之间进行通信。为此请查看:

        我个人使用 DBMS_Scheduler 实现了一个并行处理系统,并使用 DBMS_Pipe 在“线程”之间进行通信。我对两者的结合感到非常满意,并且我的主要目标(通过特定的重量级程序减少主要处理时间)实现了!

        【讨论】:

          【解决方案5】:

          您是否考虑过使用 Oracle 高级队列?

          【讨论】:

            【解决方案6】:

            像这样在 DBMS_JOB 中提交它:

            declare
              ln_dummy number;
            begin
              DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(1,100); end;');
              DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(101,200); end;');
              DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(201,300); end;');
              COMMIT;
            end;
            

            您需要将 job_queue_processes 参数设置为 >0 以生成线程来处理作业。您可以通过查看 user_jobs 视图来查询作业。

            请注意,这适用于 Oracle 9i,不确定 10g 有什么支持。查看更多信息here

            编辑:添加错过的提交

            【讨论】:

            【解决方案7】:

            您可能需要查看 DBMS_SCHEDULER。

            为完整性而编辑:

            DMBS_SCHEDULER 在 Oracle 10g 上可用。对于此之前的版本,DBMS_JOB 的工作大致相同。

            欲了解更多信息,请参阅:http://download.oracle.com/docs/cd/B12037_01/server.101/b10739/jobtosched.htm

            【讨论】:

              【解决方案8】:

              这里解释了将数据卸载到平面文件的不同方法。其中一种方法展示了如何使用 PL/SQL 进行并行执行以加快处理速度。

              http://www.oracle-developer.net/display.php?id=425

              【讨论】:

                【解决方案9】:

                +1 对于 DBMS_SCHEDULER 和 DBMS_JOB 方法,但还要考虑您是否应该使用不同的方法。

                如果您有一个以逐行方式执行的过程并且您发现它很慢,那么答案可能不是同时运行该过程多次,而是确保使用基于集合的方法来代替.在极端情况下,您甚至可以使用并行查询和并行 DML 来减少进程的挂钟时间。

                我提到这个只是因为它是一个非常常见的错误。

                【讨论】:

                • 一旦你让并行提示走出实验室,每个 Tom、Dick 和 Harry 程序员都会把它放在每个查询中,就好像它是一个 参数一样。是 vewy,vewy cawfule。
                • 是的,它会在繁忙的系统上查询资源占用。在数据仓库之类的东西上,它与 ETL 代码或报告非常相关。在繁忙的事务系统或此类系统的运营报告上无故使用它应该会受到严重打击。
                猜你喜欢
                • 2020-02-27
                • 1970-01-01
                • 2012-03-31
                • 2017-01-04
                • 1970-01-01
                • 2023-03-27
                • 2015-06-01
                • 2014-01-03
                相关资源
                最近更新 更多