сокращение времени намеченной работы - PullRequest
0 голосов
/ 16 сентября 2010

Я написал эту запланированную работу для 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 ]

2 голосов
/ 16 сентября 2010

Невозможно запланировать выполнение задания DBMS_SCHEDULER (или DBMS_JOB) каждые 5 миллисекунд. Даже если вы запланируете запускать его каждую секунду, это только приблизительное значение - это не было бы неожиданно, если бы между последовательными запусками было 2 или 3 секунды только из-за обычных задержек между тем, когда задание может быть выполнено и планировщик заданий. на самом деле поднимает его и запускает.

Почему вы хотите, чтобы работа, которую ваши комментарии описывали как "периодическая загрузка", выполнялась каждые 5 миллисекунд? Можете немного описать поток данных? Если вы ищете что-то похожее на репликацию данных в режиме реального времени, почти наверняка есть лучшие способы решения этой проблемы.

Все это, как говорится, если вы действительно хотите опрашивать очень быстро, самое близкое, что вы можете получить, это написать задание, которое выполняет бесконечный цикл, который выполняет dbms_lock.sleep в 10 миллисекунд (0,01 секунд). Это создаст все виды дополнительных сложностей, когда вам нужно будет выполнить обслуживание или закрыть базу данных, и вам придется убить текущий запущенный процесс и т. Д. Но если schema_name.DoLoads было переписано, чтобы сделать что-то вроде

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

, который будет запускать текущий процесс DoLoads каждые 0,01 секунды (10 миллисекунд). Это наименьшее приращение, которое может обработать dbms_lock.

2 голосов
/ 16 сентября 2010

"Секунда здесь, секунда там, довольно скоро вы говорите в реальном времени."

Не могли бы вы объяснить немного подробнее, чего вы пытаетесь достичь?Из вашего вопроса неясно, хотите ли вы, чтобы запланированное задание выполнялось каждые 5 миллисекунд, или же вы хотите, чтобы само запланированное задание изменяло свою частоту с 1 секунды на 5 мс.Можно указать частоту 5 мс, и это звучит как то, что вы действительно не должны делать.

Возможно, исследовать альтернативный механизм?В одной ситуации, когда мне нужно было почти мгновенное выполнение задания, я использовал Advanced Queuing для быстрого и параллельного реагирования на события в основном логическом потоке.

...