Exécuter/exécuter plusieurs procédures en Parallèle - Oracle PL/SQL
J'ai une table d'Activité qui se fait de toute la table des événements du système. Des événements comme les nouvelles commandes, à l'insertion/suppression sur toutes les tables système sera inséré dans ce tableau. Ainsi, l'absence d'événements/sec est vraiment énorme pour table d'Activité.
Maintenant, je veux processus de la réception d'événements basés sur la logique métier en fonction de la table des responsables de l'éducation de l'événement. Chaque table peut avoir différents procédure pour le traitement.
J'ai utilisé le même lien
La parallélisation des appels en PL/SQL
Comme une solution, j'ai créé plusieurs dbms_scheduler
emplois qui seront appelées en même temps. Tous ces emplois (JOB1, JOB2--- - -JOB10
) auront la même procédure (ProcForAll_Processing
) comme JOB_ACTION
pour réaliser le traitement en parallèle.
begin
dbms_scheduler.run_job('JOB1',false);
dbms_scheduler.run_job('JOB2',false);
end;
ProcForAll_Processing
: Cette procédure appellera à son tour 6 autres procédures
Proc1,proc2,proc3 --- -- - -- - Proc6
de façon séquentielle. Je veux réaliser un traitement en parallèle de ces derniers aussi bien.
P. S: On ne peut pas créer plus d'emplois pour atteindre le traitement parallèle dans ProcForAll_Processing
proc car il peut conduire à consommer plus de ressources et de DBA n'est pas d'accord pour la création d'emplois supplémentaires. Aussi, je ne peux pas utiliser
dbms_parallel_execute
pour le traitement en parallèle.
Merci de m'aider car je suis vraiment coincé pour le faire
- Il serait préférable de déplacer tout le multithreading à un autre endroit dans l'application (frontend, de niveau intermédiaire). Presque tous les langages OOP support de multithreading.
- à l'aide de la programmation orientée objet du langage n'est pas possible ici que tous les travaux effectués dans la base de données uniquement. Même la sortie est envoyé par l'intermédiaire de l'appel de service web à niveau en DB.
- Dans ce cas, vous pouvez essayer de s'adapter Producteur-Consommateur modèle de conception avec une certaine limitation de la taille de la File d'attente et le nombre de comme un fil d'emplois, de ne pas créer trop de charge sur votre base de données.
- Je suis en utilisant le fil comme des emplois, mais le pas de. de producteurs événements est si grande que je ne peux pas créer un grand nombre d'emplois pour les consommateurs. J'ai pensé à créer 10 emplois initialement, mais dans ce cas la pas de manifestations pour le 1er emploi est grande de sorte que je veux réaliser en parallèle des processus à l'intérieur du niveau d'emploi en tant que bien, mais je ne peux pas créer des emplois plus loin dans le travail d'action de la procédure.
- Bien. L'option la plus simple semble être de l'écriture de certains simple multithreading application en Java/C# à l'aide de JDBC. Il ne devrait pas être difficile, même si vous êtes un développeur back-end. Ici vous avez quelques exemples simples de Consommateur-Producteur implémentations tutorialspoint.com/javaexamples/thread_procon.htm, caveofprogramming.com/java-multithreading/... en plus de certains JDBC tutoriels tutorialspoint.com/jdbc/index.htm, docs.oracle.com/javase/tutorial/jdbc/basics.
Vous devez vous connecter pour publier un commentaire.
Il est impossible dans le cas général, sans emplois, et il va faire plusieurs séances pour cela. Il n'y a pas une telle chose comme le multithreading
PL\SQL
à quelques exceptions près. L'un d'eux est l'exécution en parallèle de sql états [1]. Donc, il y a quelques tentatives de abus ce genre de choses pour l'exécution en parallèle de PL\SQL code, par exemple, essayer de chercher ici [2].Mais comme je l'ai dit c'est abus à mon humble avis.
Référence:
Obtenir un nouveau DBA. Ou encore mieux, de les couper de tout processus de prise de décision. Administrateur de base de données ne devrait pas examiner votre code et ne devrait pas vous dire de ne pas créer des emplois, à moins qu'il y est une bonne raison spécifique.
À l'aide de DBMS_SCHEDULER pour tourner les choses en parallèle est de loin la méthode la plus simple et la plus commune façon d'atteindre ce résultat. Bien sûr il va consommer plus de ressources, c'est ce parallélisme sera inévitablement.
L'autre, les plus pauvres option est à utiliser en parallèle pipeline de la table de fonctions. C'est un PL/SQL avancé fonctionnalité qui ne peuvent pas être facilement expliqué dans un exemple simple. Le mieux que je puisse faire est de vous référer à le manuel.
Vous devriez essayer d'utiliser DBMS_PARALLEL_EXECUTE (depuis SGBDR 11).
https://blogs.oracle.com/warehousebuilder/entry/parallel_processing_in_plsql
https://oracle-base.com/articles/11g/dbms_parallel_execute_11gR2