0

我一直在 DB2 LUW 数据库中工作,我想将程序作为并行作业提交。这意味着我有一个程序可以对一个表执行一些 DDL、DML 语句。该表具有大量数据,需要运行相同的过程以并行运行更多表。

我使用 DBMS_JOB.SUBMIT 语句提交作业并使用 DBMS_JOB.RUN 语句执行作业。我有作业处理程序,它有助于并行执行此操作。

但是每个作业都是按顺序执行的(意味着第一个作业完成,然后第二个作业开始,第二个作业完成后第三个作业开始。

**我的第一个问题** 如何并行运行 DBMS_JOB?

我面临的第二个问题是当前会话仍在等待完成所有工作。我不能使用那个特定的会话,一旦所有的工作都完成了,我就可以使用同一个会话。

**我的第二个问题** *如何使会话可访问,而不是等待所有作业完成*

请帮帮我先生/女士。

4

1 回答 1

2

DBMS_JOB 是 Db2-LUW 的管理任务调度程序 (ATS) 的接口,以便与 Oracle RDBMS 兼容。但是,您也可以通过 ADMIN_TASK_ADD 和相关过程直接独立于 DBMS_JOB 使用 ATS。

我的经验是 db2acd(实现包括 ATS 在内的自主操作的进程)是不可靠的,尤其是当 ulimit 配置错误时,并且在某些情况下它不会默默地运行作业。它还有 5 分钟的唤醒时间来检查可能令人沮丧的新作业,并且它需要一个已经激活的数据库,这对于某些用例来说不方便。

我不建议将 Db2 ATS 用于应用程序层功能。全功能企业调度程序的存在是有充分理由的。

对于并行调用,我将使用企业调度工具(如果可用),或者在失败时使用操作系统提供的调度程序,无论是在 Db2 服务器上还是在最坏的情况下在客户端上,在这两种情况下都要注意每个都存储 -过程调用是它自己的调度作业,具有自己的 Db2 连接。

通过对每个存储过程调用使用一个 Db2 连接并同时调度它们,只要它们的操作不会导致相互争用,它们就会并行运行。

除此之外,我相信如果工作定义正确,ATS 将并行启动工作。检查 ADMIN_TASK_LIST 和 ADMIN_TASK_STATUS 管理视图的内容,并用 db2diag 条目证实(diaglevel 4 可能会提供更多详细信息,即使您只能临时使用它)。

对 SQL PL(或 PL/SQL)存储过程的调用相对于调用者是同步的,这意味着 Db2 连接被阻塞,直到存储过程返回。如果它正在等待存储过程完成,则不能“使会话可访问”,但您可以打开一个新连接。

对于用 C、C++、Java 或 C++/CLR 编写的存储过程,存在不同的选项。他们有更多的自由。基于消息传递/代理的解决方案存在其他选项。uch 取决于可用的技能、工具和经验。但总的来说,保持简单更明智。

于 2018-05-12T16:04:08.083 回答