Blocages - 7.0

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

EnrichVersion
7.0
EnrichProdName
Talend Data Fabric
Talend MDM Platform
Talend Open Studio for MDM
task
Installation et mise à niveau
EnrichPlatform
Talend MDM Server

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;