Optimiser les temps d’exécution d’un traitement Oracle Data Integrator ne passe pas que par des optimisations SQL à travers les mappings d’interfaces ou en faisant des optimisations sur les bases cibles, parfois il peut être extrêmement intéressant voire indispensable de paralléliser des traitements. Ces derniers s’exécutent alors dans des processus (threads) différents.
Voici comment paralléliser des traitements dans un package ODI…
Prenons l’exemple suivant qui présente une interface de départ (nommée int_import_data), suivie de 5 lancements de scénarii :
Ces 5 appels doivent impérativement être exécutés en mode Asynchrone. Chaque scénario lancé depuis ces appels est exécuté dans une session fille. Ce mode Asynchrone permet à la session courante (celle du package global) de ne pas attendre la fin d’un traitement pour lancer le traitement suivant. De cette manière, les 5 scénarii lancés depuis ce package (partie contenue dans le rectangle rouge) seront lancés simultanément.
Afin de reprendre l’exécution en mode « séquentiel », il faut positionner un point de synchronisation des traitements lancés en parallèle. Le composant OdiWaitForChildSession a été conçu pour cela :
Les valeurs assignées par défaut conviennent dans 80% des cas.
- Session parente : ID de la session parente. Si ce paramètre n’est pas spécifié, l’identifiant de session courante est utilisé.
- Intervalle inter-tests : Intervalle en secondes entre chaque groupe de test de terminaison des sessions enfants.
- Filtre de nom : Seules les sessions enfants dont les noms correspondent à ce filtre sont testées. Ce filtre peut être un masque au format LIKE SQL.
- Mots clés : Seules les sessions enfants dont TOUS les mot-clés sont reconnus dans cette liste sont testées. Chaque élément de cette liste délimitée par des virgules peut être un masque au format LIKE SQL.
- Max. de sessions filles en erreur : Ce paramètre permet à OdiWaitForChildSession de terminer en erreur si un nombre de sessions filles s’est terminé en erreur. ALL : Erreur si toutes les sessions filles se sont terminées en erreur.
Il faut cependant manipuler la parallélisation avec précaution car une anomalie dans sa mise en place peut entraîner de sérieux problèmes : deadlocks, pertes de données, commits prématurés, etc.
Exemple : vous souhaitez avoir plusieurs processus qui chargent des fichiers sources d’un même répertoire, il faut alors veiller à ce que les instructions de lecture/écriture sur les fichiers ne soient pas en accès concurrentiels. Dans cette situation, l’exécution peut facilement se retrouver en deadlock.