0

Oracle DBMS_Scheduler 有什么好处?

  1. 每次都安排(禁用)作业。并在需要时启用并运行它。
  2. 创建作业,运行它并删除它。

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

4

1 回答 1

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) 的作业,但不是读取表,而是将请求从队列中拉出。

于 2015-09-08T03:03:30.607 回答