2015-09-07 3 views
0

Что хорошего для Oracle DBMS_Scheduler?лучшие практики с Oracle DBMS_Scheduler

  1. проведение задания запланировано (отключено) каждый раз. и включить его и запустить, когда это необходимо.
  2. создайте задание, запустите его и опустите.

У меня есть таблица x и всякий раз, когда записи попадают в эту таблицу, у меня должна быть работа над обработкой этой записи. мы можем или не иметь записи вставки всегда. Помня об этом ... что лучше ...?

+1

Замки, как для создания задания планировщика, для выполнения вашей работы только один раз (или изредка). Это не цель задания планировщика. Цель состоит в том, чтобы регулярно выполнять задание. –

+0

Это примерно 60 000-й вопрос оракула :) –

+1

@Wernfried: Я регулярно использую 'dbms_scheduler' для запуска задания только один раз в фоновом режиме, чтобы я мог отключить/закрыть мой SQL-клиент и не нужно ждать результат длительной операции. –

ответ

1

Обработка строк, как они появляются в таблице в асинхронном процессе может быть сделано несколькими различными способами, выбрать способ, который подходит вам:

  1. Добавить триггер в таблицу, которая создает один -off для обработки строки с использованием DBMS_JOB. Это подходит, если объем данных, вставленных в таблицу, довольно низок, и вы не хотите, чтобы ваша работа работала все время. Преимущество DBMS_JOB заключается в том, что задание не запускается до тех пор, пока вставка не будет выполнена; если он откат, задание также откатывается, поэтому не запускается. Недостаток заключается в том, что если есть устойчивый всплеск активности, все созданные задания будут вытеснять любые другие выполняемые задания.

  2. Создайте одно задание, используя DBMS_SCHEDULER, который работает регулярно, опроса таблицы для новых записей и обрабатывает их. Для этого метода потребуется столбец таблицы, который он может обновить, чтобы отметить каждую запись как «обработанную». Например, добавьте флаг VARCHAR2(1), который установлен в 'Y' на вставке и установлен в NULL заданием после обработки. Вы можете добавить индекс к этому флагу, который будет хранить записи только для необработанных строк (поэтому он будет небольшим и быстрым). Этот метод намного эффективнее, особенно для больших объемов данных, поскольку каждый запуск задания может эффективно обрабатывать большие куски данных навалом за раз.

  3. Использование Oracle Advanced Queuing. http://docs.oracle.com/cd/E11882_01/server.112/e11013/aq_intro.htm#ADQUE0100

Для (1), отдельное задание создается для каждой записи в таблице. Вам не нужно создавать задания. Однако вам нужно следить за ними; если вы не справитесь, вам нужно будет исследовать и повторно запускать вручную.

Для (2) вы просто создаете одно задание и позволяете ему работать регулярно. Если одна запись не удалась, ее можно было бы получить на следующей итерации задания. Я обрабатывал каждую запись в отдельной транзакции, поэтому сбой одной записи не влияет на сбой других записей, все еще находящихся в очереди.

Для (3) вы все равно создаете задание типа (2), но вместо чтения таблицы оно вытаскивает запросы из очереди.

Смежные вопросы