Résolution de problèmes relatifs au stockage SQL de MDM

EnrichVersion
6.4
6.3
6.2
6.1
6.0
5.6
EnrichProdName
Talend Open Studio for MDM
Talend MDM Platform
Talend Data Fabric
task
Installation et mise à niveau
EnrichPlatform
Talend MDM Server

Résolution de problèmes relatifs au stockage SQL de MDM

Après avoir effectué les configurations nécessaires pour l'utilisation du Stockage SQL de MDM et procédé à l'utilisation du stockage SQL de MDM, vous pouvez rencontrer un grand nombre de problèmes en fonction du SGBDR que vous utilisez.

Cet article fournit des informations sur la résolution de problèmes ainsi que plusieurs informations spécifiques sur la manière d'aborder les problèmes suivants :

Blocages

Lorsqu'un problème inattendu lié à l'exécution de requêtes SQL survient et que le serveur ne donne aucune réponse pendant un certain temps, un message s'inscrit dans le log du serveur, qui s'affiche comme suit :

014-01-17 00:29:12,733 WARN  [com.mchange.v2.async.ThreadPoolAsynchronousRunner] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@5614f781 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!

Bien qu'il indique "DEADLOCK", cela ne signifie pas toujours qu'il s'agit d'un blocage au niveau de la base de données.

MDM utilise un pool de connexions JDBC et ce pool est monitoré par un autre process. Ce process de monitoring s'assure que le pool remplit tous les critères définis dans la configuration, tels que la taille minimale de pool et le renouvellement de la connexion.

La partie importante du message ci-dessus est "APPARENT" : ce message est inscrit par le process de monitoring. Cela signifie qu'il n'a pas pu maintenir un pool sain pendant un certain moment. La cause peut être :

  • Un blocage réel de la base de données : toutes les connexions empruntées attendent la fin de l'exécution et le pool ne peut pas s'étendre.
  • Un problème de connexion de MDM à la base de données : le pool ne peut pas s'étendre, car toutes les connexions à la base de données ont échoué à cause d'identifiants incorrects ou de problèmes de réseau.

Pour plusieurs SGBDR tels que Oracle, le serveur MDM peut parfois provoquer un blocage des transactions futures dans le serveur Oracle. Pour résoudre les blocages, vous devez rechercher les colonnes de clés étrangères spécifiques dans lesquelles manquent leurs index, puis créer manuellement les index manquants de clés étrangères pour résoudre les problèmes.

Voici un script Oracle PL/SQL pour créer les index de toutes les clés étrangères dans les tables utilisateur d'une base de données Oracle. Vous devez exécuter ce script en tant qu'utilisateur de la base de données, non pas lorsque vous êtes connecté avec un compte système ou administrateur.

DECLARE
  -- Public variable declarations
  sql_str        VARCHAR2(5000);
  tableName      user_cons_columns.TABLE_NAME%type;
  fkColumnName   user_cons_columns.COLUMN_NAME%type;
  tableSpaceName varchar2(50);
  num NUMBER(10) NOT NULL := 0;
 
  CURSOR table_fk_cur IS
    SELECT ucc.table_name, ucc.column_name
      FROM user_constraints uc, user_cons_columns ucc
     WHERE uc.constraint_name = ucc.constraint_name
       AND uc.constraint_type = 'R'
     ORDER BY ucc.table_name, uc.constraint_name;
 
BEGIN
  DBMS_OUTPUT.ENABLE(200000);
   
  --get tablespace name
  SELECT property_value
    INTO tableSpaceName
    FROM database_properties
   WHERE property_name like 'DEFAULT_PERMANENT_TABLESPACE';
 
 
  OPEN table_fk_cur;
  LOOP
    FETCH table_fk_cur
      INTO tableName, fkColumnName;
       
    EXIT WHEN table_fk_cur%NOTFOUND;
     
    num := num + 1;
    dbms_output.put_line(tableName || '  ' || fkColumnName);
   
    sql_str := 'CREATE INDEX MISSING_FK_IDX_' || num || ' ON ' || tableName || ' ( ' || fkColumnName ||
               ' ) TABLESPACE ' || tableSpaceName;
    dbms_output.put_line(sql_str);
   
    execute immediate sql_str;
     
  END LOOP;
  CLOSE table_fk_cur;
   
  dbms_output.put_line('Totally ' || num || ' of foreign key columns are indexed.'); 
END;

Problèmes spécifiques aux modèles de données

Le stockage SQL de MDM ne peut pas gérer les entités qui créent une dépendance cyclique dans la définition des clés étrangères, c'est-à-dire l'entité A fait référence à l'entité B qui fait référence à l'entité C qui en retour fait référence à l'entité A. Dans ce cas, un message d'erreur s'affiche :

Caused by: java.lang.IllegalArgumentException: Data model has at least one circular dependency.
(Hint: SiteInjectionRpd -> Contrat -> Edp -> SiteInjectionRpd)
(Possible fields: Edp/typeEdp/EdpRpd/SitesInjectionRpd/SiteInjectionRpd UniteAgregation/typeUA/UAPointInjectionRpd/SitesInjectionRpd/SiteInjectionRpd Edprev/typeEdprev/EdprevRpd/SitesInjectionRpd/SiteInjectionRpd )

L'exception vous donne un chemin d'accès qui contient la dépendance cyclique. MDM vous donne un cycle et non tous les cycles dans le modèle de données. La pile d'exception vous donne également une liste de champs dans lesquels il est possible que vous deviez désactiver l'intégrité de la clé étrangère (MDM ne le fait pas automatiquement, car cela reste une décision de l'utilisateur final).

L'un des moyens d'améliorer l'expérience utilisateur est d'effectuer une détection de dépendance cyclique dans l'éditeur des modèles de données du studio. Actuellement, cette vérification est uniquement réalisée sur le serveur.

Considérations spécifiques aux bases de données

Rappelez-vous des considérations suivantes lorsque vous devez gérer des types de données et des instructions SQL dans différentes bases de données.

Oracle

Pour l'élément xsd:decimal, les zéros à droite de la virgule sont supprimés. Par exemple, si vous saisissez une valeur "130000.00", elle retournera "130000".

SQL Server

Pour les éléments xsd:byte et xsd:unsignedByte, SQL Server utilise des octets sans signature. Si le pilote JDBC Microsoft est utilisé, la recherche de la valeur "entity with field > -50" est automatiquement convertie en "entity with field > 50", car le caractère moins est supprimé.

Problèmes d'initialisation

En cas de problème d'initialisation, le stockage SQL fournit l'information qui peut aider à identifier la raison pour laquelle l'initialisation a échoué.

L'information suivante est fournie : le modèle de données utilisé lors de l'initialisation (sous une forme interprétée de MDM, non pas comme un schéma XML).

Causes les plus fréquentes d'exceptions :

  • Modèle de données contenant des erreurs (par exemple, la clé étrangère pointe vers un élément non existant dans le modèle de données).
  • Présence de noms utilisés par le stockage SQL (assurez-vous que les éléments définis ne commencent pas par X_TALEND_).

Causes les plus fréquentes d'avertissements :

  • Impossibilité d'exprimer les contraintes du modèle de données dans les bases de données : MDM génère le schéma de la base de données qui inclut de nombreuses informations du modèle de données (vérifications de l'intégrité de clés étrangères, éléments non vides, etc.). Mais, dans des cas souvent liés aux séquences, le schéma de la base de données ne peut exprimer les contraintes du modèle de données. Il s'agit seulement d'un avertissement, car la validation XML s'assurera que toutes les contraintes du modèle de données sont correctement appliquées.

Problèmes de suppression

Le stockage SQL de MDM utilise une requête pour sélectionner les instances à supprimer. Si des erreurs surviennent, MDM fournit la requête au log du serveur, ce qui vous permet d'analyser la requête et de vérifier la raison pour laquelle la suppression a échoué.

[SELECT]
        Types
                Person
        Selected fields
        Join
                <NONE>
        Condition
                <NONE>
        Order by
                <NONE>

Problèmes relatifs aux résultats de requêtes

La sélection d'un élément XML n'ayant aucun contenu de texte retourne toujours une chaîne de caractères vide.

Comme l'exemple suivant le montre, l'élément sélectionné, Features, est un élément "wrapper". La requête retourne un élément XML "Features", sans aucun contenu (dans ce cas, la base de données XML peut effectuer une concaténation de valeurs).

<Product>
    <Features>
        <Colors>
            <Color>Blue</Color>
            <Color>Red</Color>
        </Colors>
    </Features>
</Product>

Problèmes d'exécution de requêtes

Lors de problèmes d'exécution de requêtes, MDM fournit la structure de la requête analysée (et les jointures, conditions Where). Par exemple :

[SELECT]
        Types
                Person
        Selected fields
                [FIELD]
                        Person/firstname
                [FIELD]
                        Address/Street
                [FIELD]
                        Country/name
        Join
                [JOIN]
                        [LEFT]
                                [FIELD]
                                        addresses/address
 
                        [RIGHT]
                                [FIELD]
                                        Address/Id
                                        Address/enterprise
                [JOIN]
                        [LEFT]
                                [FIELD]
                                        Address/country
                        [RIGHT]
                                [FIELD]
                                        Country/id
        Condition
                <NONE>
        Order by
                <NONE>

Les causes les plus fréquentes d'exceptions (requêtes plein texte) :

  • La recherche plein texte inclut des conditions autres que le plein texte : il s'agit d'une limitation connue en raison de la technologie utilisée lors de recherches plein texte. Les opérateurs supportés dans une recherche plein texte sont : supérieur à (>), supérieur ou égal à (>=), inférieur à (<), inférieur ou égal à (<=).

Les causes les plus fréquentes d'exceptions (autres types de requêtes) :

  • La jointure est effectuée sur un champ inaccessible par le type principal sélectionné.
  • Une fonction IsEmptyOrNull est exécutée sur un élément répétable.

FAQ

Q : Pourquoi ma base de données ne fonctionne-t-elle pas avec MDM ?

R : Vous devez vérifier les versions supportées de chaque base de données.

Q : Est-ce que MDM supporte la création automatique de bases de données ?

R : Oui, MDM supporte la création automatique de bases de données. Cependant, assurez-vous que la valeur de la propriété "db.autoPrepare" dans le fichier mdm.conf est "true" (tout autre valeur vaut “false”). Lorsque la valeur de la propriété vaut "true", vous devez voir la ligne suivante dans le log :

2014-05-14 17:58:45,772 29324 INFO
[com.amalto.core.storage.hibernate.HibernateStorage] (main:) Preparing
database before schema generation.

Lorsque cette valeur est "false", vous devez voir la ligne suivante :

2014-05-14 13:26:58,107 INFO
[com.amalto.core.storage.hibernate.HibernateStorage] *NOT* preparing
database before schema generation.

Q : Comment puis-je supprimer toutes les tables et laisser MDM les recréer dans Oracle ?

R : Le script suivant vous permet de supprimer toutes les tables dans Oracle, sans supprimer ou recréer l'espace dédié aux tables.

Vous devez exécuter ce script en tant qu'utilisateur de la base de données, non pas lorsque vous êtes connecté en tant que compte système ou administrateur.

declare
  
v_str1 varchar2(200)
:= null;
 
cursor get_sql is
 
select
'drop '||object_type||'
'|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS PURGE')
v_str1
 
from user_objects
 
where object_type in ('TABLE','VIEW','PACKAGE','TYPE','PROCEDURE','FUNCTION','TRIGGER','SEQUENCE')
 
order by object_type,object_name;
 
begin
 
open get_sql;
 
loop
 
fetch get_sql into v_str1;
 
if get_sql%notfound
 
then exit;
 
end if;
 
execute immediate v_str1;
 
end loop;
 
close get_sql;
 
end;
 
 
/