Запуск/выполнение нескольких процедур параллельно — Oracle PL/SQL

У меня есть таблица действий, которая получает все события таблицы системы. Такие события, как новые заказы, вставка/удаление во всех системных таблицах, будут вставлены в эту таблицу. Таким образом, количество событий в секунду действительно огромно для таблицы Activity.

Теперь я хочу обрабатывать входящие события на основе бизнес-логики в зависимости от таблицы, ответственной за инициирование события. Каждая таблица может иметь различную процедуру обработки.

Я использовал ту же ссылку Распараллеливание вызовов в PL/SQL

В качестве решения я создал несколько заданий dbms_scheduler, которые будут вызываться одновременно. Все эти задания (JOB1, JOB2--- - -JOB10) будут иметь ту же процедуру (ProcForAll_Processing), что и JOB_ACTION, для обеспечения параллельной обработки.

begin
    dbms_scheduler.run_job('JOB1',false);
    dbms_scheduler.run_job('JOB2',false);
  end; 

ProcForAll_Processing: эта процедура, в свою очередь, вызовет 6 других процедур Proc1,proc2,proc3 --- -- - -- - Proc6 в последовательном порядке. Я хочу добиться параллельной обработки и для них.

P.S: Мы не можем создавать дополнительные задания для обеспечения параллельной обработки в процедуре ProcForAll_Processing, так как это может привести к потреблению дополнительных ресурсов, а также DBA не дает согласия на создание дополнительных заданий. Кроме того, я не могу использовать dbms_parallel_execute для параллельной обработки.

Пожалуйста, помогите мне, так как я действительно застрял, чтобы сделать это


person Ankur Bhutani    schedule 22.01.2016    source источник
comment
Было бы лучше перенести всю многопоточность в какое-то другое место в приложении (фронтенд, средний уровень). Почти все языки ООП поддерживают многопоточность.   -  person AndrewMcCoist    schedule 23.01.2016
comment
использование языка ООП здесь невозможно, так как вся работа выполняется только в базе данных. Даже выходные данные отправляются через вызов веб-службы на уровне БД.   -  person Ankur Bhutani    schedule 27.01.2016
comment
В этом случае вы можете попробовать адаптировать шаблон проектирования «Производитель-Потребитель» с некоторым ограниченным размером очереди и количеством многопоточных заданий, чтобы не создавать слишком большую нагрузку на вашу базу данных.   -  person AndrewMcCoist    schedule 27.01.2016
comment
Я использую поток, как рабочие места, но нет. событий производителей настолько велико, что я не могу создать большое количество рабочих мест для потребителей. Сначала я думал создать 10 заданий, но в этом случае количество событий для 1 задания велико, поэтому я хочу добиться параллельного процесса и внутри уровня задания, но я не могу создавать задания дальше в процедуре действия задания.   -  person Ankur Bhutani    schedule 27.01.2016
comment
Хорошо. Самый простой вариант — написать какое-нибудь простое многопоточное приложение на Java/C# с ​​использованием JDBC. Это не должно быть так сложно, даже если вы бэкенд-разработчик. Вот несколько простых примеров реализации Consumer-Producer tutorialspoint.com/javaexamples/thread_procon.htm, caveofprogramming.com/java -multithreading/ плюс несколько руководств по JDBC tutorialspoint.com/jdbc/index.htm, docs.oracle.com/javase/tutorial/jdbc/basics.   -  person AndrewMcCoist    schedule 27.01.2016


Ответы (3)


Без заданий в общем случае нельзя, и для этого потребуется несколько сессий. Не существует такой вещи, как многопоточность PL\SQL за некоторыми исключениями. Одним из них является параллельное выполнение операторов sql [1]. Так что есть некоторые попытки злоупотребить этим материалом для параллельного выполнения кода PL\SQL, например попробуйте посмотреть здесь [2].

Но, как я уже сказал, это злоупотребление ИМХО.

Ссылка:

  1. https://docs.oracle.com/cd/B19306_01/server.102/b14223/usingpe.htm
  2. http://www.williamrobertson.net/documents/parallel-plsql-launcher.html
person Ilia Maskov    schedule 22.01.2016
comment
Если ваша логика обработки выполняется построчно, вы можете подумать о преобразовании ее для использования алгоритма на основе набора; который затем поддается параллельному выполнению. Запуск нескольких потоков построчно будет масштабироваться только до сих пор. - person BobC; 05.03.2017
comment
Я только что быстро просмотрел ссылку № 2 выше. Я думаю, что Автор сам это сказал. Цитата: На самом деле это говорило мне о том, что я не полностью понял PQ. - person BobC; 05.03.2017
comment
@BobC, но в конце концов ему удалось добиться параллельного выполнения, возможно, без глубокого понимания того, что под капотом. - person Ilia Maskov; 13.03.2017
comment
@ИльяМасков. Его работа оставляет желать лучшего. Есть несколько оплошностей, неправильных представлений и недоразумений. Итак, вы действительно хотите основывать свою работу на этом? Это одна из проблем с Интернетом; все считается хорошим и верным. - person BobC; 13.03.2017
comment
@BobC His work leaves a lot to be desired — точно. Никто не говорил, что это хорошо и подходит для реального использования. Вы видели выделенное жирным шрифтом слово злоупотребление в моем тексте? Это просто обзор проблемы. - person Ilia Maskov; 13.03.2017

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

Использование DBMS_SCHEDULER для параллельного запуска — это, безусловно, самый простой и распространенный способ добиться этого результата. Конечно, это будет потреблять больше ресурсов, что неизбежно произойдет с параллелизмом.

Другой, более неудачный вариант — использовать параллельные конвейерные табличные функции. Это расширенная функция PL/SQL, которую нелегко объяснить на простом примере. Лучшее, что я могу сделать, это отослать вас к руководству.

person Jon Heller    schedule 23.01.2016
comment
Спасибо, Джон, ты чемпион! Теперь я могу поставить как опции DBMS_SCHEDULER, так и параллельные конвейерные табличные функции - person Ankur Bhutani; 25.01.2016

Вам следует попробовать использовать DBMS_PARALLEL_EXECUTE (начиная с RDBMS 11).
https://blogs.oracle.com/warehousebuilder/entry/parallel_processing_in_plsql
https://oracle-base.com/articles/11g/dbms_parallel_execute_11gR2

person Leon    schedule 04.03.2017