Oracle DBMS_Scheduler的最佳实践

时间:2015-09-07 11:20:22

标签: oracle plsql oracle11g dbms-scheduler

对Oracle DBMS_Scheduler有什么好处?

  1. 每次都安排(禁用)作业。并启用它并在需要时运行它。
  2. 创建作业,运行并放弃它。
  3. 我有一个表x,每当记录提交到该表时,我应该有一个工作来处理该记录。 我们可能会或可能不会有记录插入... 牢记这一点......哪个更好......?

1 个答案:

答案 0 :(得分:1)

处理异步进程中表中出现的行可以通过多种不同方式完成,选择适合您的方式:

  1. 向表中添加触发器,创建一次性作业以使用DBMS_JOB处理行。如果插入到表格中的数据量非常低,并且您不希望您的作业一直在运行,这是合适的。 DBMS_JOB的优点是在提交插入之前作业不会启动;如果它被回滚,则作业也会回滚,因此不会运行。缺点是,如果活动持续激增,所有创造的工作将挤出正在运行的任何其他工作。

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

  3. 使用Oracle Advanced Queuing。 http://docs.oracle.com/cd/E11882_01/server.112/e11013/aq_intro.htm#ADQUE0100

  4. 对于(1),为表中的每条记录创建一个单独的作业。你不需要创造就业机会。但是,您需要监控它们;如果一个失败,你需要调查并手动重新运行。

    对于(2),您只需创建一个作业并让它定期运行。如果一个记录失败,则可以通过下一次作业迭代来获取它。我会在一个单独的事务中处理每个记录,因此一条记录的失败不会影响仍在队列中的其他记录的失败。

    对于(3),你仍然创建一个类似于(2)的作业,但不是读表,而是将请求从队列中拉出来。