2015-09-07 78 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)這樣的作業,但不是讀取該表,而是將請求從隊列中拉出。