对Oracle DBMS_Scheduler有什么好处?
我有一个表x,每当记录提交到该表时,我应该有一个工作来处理该记录。 我们可能会或可能不会有记录插入... 牢记这一点......哪个更好......?
答案 0 :(得分:1)
处理异步进程中表中出现的行可以通过多种不同方式完成,选择适合您的方式:
向表中添加触发器,创建一次性作业以使用DBMS_JOB
处理行。如果插入到表格中的数据量非常低,并且您不希望您的作业一直在运行,这是合适的。 DBMS_JOB
的优点是在提交插入之前作业不会启动;如果它被回滚,则作业也会回滚,因此不会运行。缺点是,如果活动持续激增,所有创造的工作将挤出正在运行的任何其他工作。
使用定期运行的DBMS_SCHEDULER
创建单个作业,轮询表以获取新记录并处理它们。该方法需要一个表上的列,它可以更新以将每个记录标记为"已处理"。例如,添加VARCHAR2(1)
标志,该标志在插入时设置为'Y'
,并在处理后由作业设置为NULL
。您可以为该标志添加一个索引,该索引仅存储未处理行的条目(因此它将小而快)。这种方法效率更高,特别是对于大数据量,因为每次运行的作业都可以有效地一次批量处理大块数据。
使用Oracle Advanced Queuing。 http://docs.oracle.com/cd/E11882_01/server.112/e11013/aq_intro.htm#ADQUE0100
对于(1),为表中的每条记录创建一个单独的作业。你不需要创造就业机会。但是,您需要监控它们;如果一个失败,你需要调查并手动重新运行。
对于(2),您只需创建一个作业并让它定期运行。如果一个记录失败,则可以通过下一次作业迭代来获取它。我会在一个单独的事务中处理每个记录,因此一条记录的失败不会影响仍在队列中的其他记录的失败。
对于(3),你仍然创建一个类似于(2)的作业,但不是读表,而是将请求从队列中拉出来。