2015-09-07 48 views
0

Oracle DBMS_Scheduler有什么好处?Oracle DBMS_Scheduler的最佳实践

  1. 保持工作计划(禁用)每次。并启用它并在需要时运行它。
  2. 创建作业,运行并放下它。

我有一个表x,每当一个记录被提交给该表时,我应该有一个工作来处理该记录。 我们可能会或可能不会有记录插入始终.. 记住这一点..有什么更好的...?

+1

锁定喜欢创建一个计划任务来执行您的工作只有一次(或偶尔)。这不是调度程序作业的目的。目的是定期进行工作。 –

+0

这大概是第60.000th oracle问题:) –

+1

@Wernfried:我经常使用'dbms_scheduler'在后台运行一次作业,这样我就可以断开/关闭我的SQL客户端,不需要等待冗长的操作结果。 –

回答

1

异步处理处理行,因为他们出现在一个表可以在许多不同的方式来完成,选择最适合自己的方式:

  1. 触发添加到它创建一个表使用DBMS_JOB处理该行的作业。如果插入到表中的数据量很低,并且您不希望自己的作业一直在运行,那么这很适合。 DBMS_JOB的优点在于,在插入提交之前,作业不会启动;如果回滚,作业也会回滚,因此无法运行。缺点是,如果活动持续激增,所创建的所有工作将挤掉正在运行的其他工作。

  2. 使用定期运行的DBMS_SCHEDULER创建单个作业,轮询表以查找新记录并处理它们。此方法需要在表格上添加一列,以便将每条记录标记为“已处理”。例如,添加一个VARCHAR2(1)标志,该标志在插入时设置为'Y',并在处理后由作业设置为NULL。您可以添加一个索引到该标志,这将只存储未处理的行的条目(所以它会小而快)。此方法效率更高,尤其是对于大数据量,因为每次作业运行都可以一次批量处理大量数据。

  3. 使用Oracle高级队列。 http://docs.oracle.com/cd/E11882_01/server.112/e11013/aq_intro.htm#ADQUE0100

对于(1),为表中的每个记录创建一个单独的作业。你不需要创建工作。但是,您确实需要监视它们;如果出现故障,您需要进行调查并手动重新运行。对于(2),您只需创建一个作业并让其定期运行。如果有一条记录失败,那么可以在下一次迭代中找到它。我将在单独的事务中处理每条记录,这样一条记录的失败不会影响仍在队列中的其他记录的失败。对于(3),您仍然创建一个像(2)这样的作业,但不是读取该表,而是将请求从队列中拉出。