2010-09-16 36 views
-1

我已經爲每秒運行的ORACLE DB 編寫了此計劃作業。減少預定作業的時間

現在在我的日程安排程序中,我想要做的是將 設置爲每5毫秒的頻率。

BEGIN  
    sys.dbms_scheduler.create_schedule( 
      repeat_interval =>'FREQ=SECONDLY;INTERVAL=1', 
      start_date => to_date('15:19 09/16/10','HH24:MI MM/DD/YY'), 
      comments => 'Schedule for periodic loads', 
      schedule_name => 'UserName.DOLOADS'); 
END; 

等待您的寶貴建議..

回答

2

「的第二個位置,第二那裏,很快你說的實時性。」

你能詳細解釋一下你想達到的目標嗎?從您的問題來看,您是不是隻想每5毫秒執行一次計劃作業,或者是否希望計劃作業本身將其頻率從1秒更改爲5毫秒,這一點還不清楚。

我不知道是否可以指定5ms的頻率,這聽起來像你真的不應該做的事情。

也許調查一個替代機制?在一種需要近乎即時工作執行的情況下,我使用高級隊列來快速響應事件,並與主邏輯流程並行進行響應。

+0

+1因爲如果你需要每秒運行一個工作,你肯定需要一些排隊的東西,而不是每秒運行的工作。 – ZeissS 2010-09-16 15:14:19

2

您無法安排DBMS_SCHEDULER(或DBMS_JOB)作業每5毫秒運行一次。即使您計劃每秒運行一次,這也只是一個近似值 - 如果在連續運行之間有2或3秒時間,這僅僅是因爲作業有資格運行和作業調度程序之間的正常延遲實際上拿起它並開始運行它。

爲什麼要將您的評論描述爲「週期性負載」的工作每5毫秒運行一次?你能描述一下數據流嗎?如果您正在尋找接近實時數據複製的東西,幾乎可以找到更好的方法來解決這個問題。

所有這一切是說,如果你真的非常迅速地查詢,你大概可以得到最接近的是編寫運行一個無限循環,它的10毫秒(0.01秒)DBMS_LOCK.SLEEP工作。這將引進時,你必須做保養或關閉數據庫,並有殺死當前運行的進程等的額外的複雜性的各種但如果schema_name.DoLoads被改寫像做

CREATE PROCEDURE NewDoLoads 
AS  
BEGIN 
    WHILE(true) 
    LOOP 
    schema_name.DoLoads; 
    dbms_lock.sleep(0.01); 
    END LOOP; 
END NewDoLoads; 

那會每0.01秒(10毫秒)執行當前的DoLoads進程。這是dbms_lock可以處理的最小增量。

+1

+1不斷運轉的工作絕對比每隔幾毫秒開始一項工作要好。 – APC 2010-09-16 15:34:47