Oracle dbms_job выполняет задания с разными задержками в 5 секунд. Как заставить его выполнять работу с заданным интервалом без задержек? - PullRequest
2 голосов
/ 19 июня 2020

Я создал простое задание с помощью пакета DBMS_JOB (протестировано под oracle 12.2 и 11.2)

begin
  sys.dbms_job.submit(job => :job,
                      what => 'null;',
                      next_date => to_date('19-06-2020 22:26:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'trunc(sysdate,''MI'')+1/24/60');
  commit;
end;

Оно должно запускаться ровно каждую минуту (без секундной задержки)

Затем я используйте

select last_date, last_sec, next_date, what,interval from all_jobs where job=:job

, чтобы отслеживать время последнего запуска и время следующего запуска. Я получал вывод каждую минуту и ​​помещал его в таблицу ниже. Вот результаты выполнения задания:

| LAST_DATE           | LAST_SEC | NEXT_DATE           | WHAT  | INTERVAL                    |
| 2020-06-19 22:33:02 | 22:33:02 | 2020-06-19 22:34:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:34:07 | 22:34:07 | 2020-06-19 22:35:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:35:13 | 22:35:13 | 2020-06-19 22:36:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:36:18 | 22:36:18 | 2020-06-19 22:37:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:37:24 | 22:37:24 | 2020-06-19 22:38:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:38:30 | 22:38:30 | 2020-06-19 22:39:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:39:05 | 22:39:05 | 2020-06-19 22:40:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:40:10 | 22:40:10 | 2020-06-19 22:41:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:41:16 | 22:41:16 | 2020-06-19 22:42:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:42:21 | 22:42:21 | 2020-06-19 22:43:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:43:27 | 22:43:27 | 2020-06-19 22:44:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:44:02 | 22:44:02 | 2020-06-19 22:45:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:45:08 | 22:45:08 | 2020-06-19 22:46:00 | null; | trunc(sysdate,'MI')+1/24/60 |

Хмм ... NEXT_DATE показывает правильное время, а LAST_DATE / LAST_SEC показывает время с задержкой. Задержка времени запуска задания постоянно увеличивается от нуля до 30 секунд: 2, 7, 13, 18, 24, 30. Затем снова с нуля: 5, 10, 16, 21, 27 Затем снова 2, 8, ... et c.

Почему он начинается каждый раз не точно в: 00 se c и постоянно растет? Как заставить запускаться именно в нужное время?

Обычно я не могу использовать DBMS_SCHEDULER с календарным синтаксисом. Мне нужно точно рассчитать время следующего задания с помощью функции pl / sql в соответствии с моим сложным алгоритмом.

Дополнение: ту же задержку при запуске задания можно увидеть, если вы установите для параметра what что-то вроде :

insert into my_table(last_date) values(sysdate);

1 Ответ

3 голосов
/ 20 июня 2020

DBMS_JOB всегда подвергался сползанию по расписанию, потому что интервал рассчитывается с момента окончания задания , поэтому интервал - это то, что вы указываете , плюс время, которое потребовалось для выполнения предыдущего выполнения задания . Если вам нужно такое точное планирование, вам нужно использовать Oracle Scheduler (DBMS_SCHEDULER). Это позволит вам планировать казни до второго, без сползания. Вот несколько ресурсов, которые помогут вам лучше с ним познакомиться:

Пример ниже DDL для создания задания, которое выполняется один раз в минуту:

BEGIN
  -- Job defined entirely by the CREATE JOB procedure.
  DBMS_SCHEDULER.create_job (
    job_name        => 'test_full_job_definition',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN DBMS_STATS.gather_schema_stats(''SCOTT''); END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=minutely; bysecond=0',
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Job defined entirely by the CREATE JOB procedure.');
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...