【问题标题】:Implementing Multithreading in Oracle Procedures在 Oracle 过程中实现多线程
【发布时间】:2012-01-03 01:07:04
【问题描述】:

我正在开发 Oracle 10gR2。

这是我的问题 -

我有一个过程,我们称它为 *proc_parent*(在包内),它应该调用另一个过程,我们称它为 *user_creation*。我必须在循环中调用 *user_creation*,该循环正在从表中读取一些列 - 这些列值作为参数传递给 *user_creation* 过程。

代码是这样的:

FOR i IN (SELECT    community_id,
                        password,
                        username 
               FROM     customer 
               WHERE    community_id IS NOT NULL 
               AND      created_by = 'SRC_GLOB'
              )
     LOOP
        user_creation (i.community_id,i.password,i.username);
     END LOOP;

COMMIT;

user_Creation 过程正在为某些业务逻辑调用 Web 服务,然后根据响应更新表。

我需要在这里找到一种可以使用多线程的方法,以便我可以运行此过程的多个实例来加快速度。我知道我可以使用 *DBMS_SCHEDULER* 并且可能使用 *DBMS_ALERT* 但我不知道如何在循环中使用它们。

有人可以指导我正确的方向吗?

谢谢, 安库尔

【问题讨论】:

    标签: multithreading oracle plsql oracle10g dbms-scheduler


    【解决方案1】:

    您可以同时提交大量工作。见Example 28-2 Creating a Set of Lightweight Jobs in a Single Transaction

    这会在 pl/sql 表中填充您要在一个 tx 中同时提交的所有作业。一旦提交(启用)它们就会开始运行,系统可以处理多少,或者资源管理器计划允许多少。

    轻量级作业的开销非常...最小/轻。

    【讨论】:

      【解决方案2】:

      我想结束这个问题。 DBMS_SCHEDULER 和 DBMS_JOB(尽管 DBMS_SCHEDULER 是首选)可以在循环内用于提交和执行作业。

      例如,这里有一个示例代码,使用可以在循环中调用的 DBMS_JOB:

      ...
      FOR i IN (SELECT community_id,
                       password,
                       username
                FROM   customer
                WHERE  community_id IS NOT NULL
                AND    created_by = 'SRC_GLOB'
               )
      LOOP
      DBMS_JOB.SUBMIT(JOB => jobnum,
                      WHAT => 'BEGIN user_creation (i.community_id,i.password,i.username); END;'      
      COMMIT;
      END LOOP;   
      

      SUBMIT 之后使用提交将并行启动工作(以及过程)。

      【讨论】:

        猜你喜欢
        • 2021-07-23
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-29
        • 1970-01-01
        相关资源
        最近更新 更多