Suivi et surveillance (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Cette rubrique vous explique comment utiliser les capacités de suivi et de surveillance de FireDAC. Ces dernières constituent l'essentiel de l'outil de débogage d'application de FireDAC et déterminent comment une application communique avec une base de données.

Présentation

La sortie de suivi FireDAC est le journal détaillé des communications entre l'application FireDAC et le logiciel de base de données. Ce journal comprend les numéros de référence, l'horodatage, les appels à l'API, le SQL envoyé à une base de données, les données échangées avec les valeurs des paramètres et des champs, les erreurs et les avertissements, ainsi que le rapport d'environnement du SGBD (Système de gestion de bases de données ou DBMS).

FireDAC offre 3 méthodes pour générer la sortie de suivi. Toutes sont contrôlées par les différents composants et les différentes valeurs du paramètre de connexion MonitorBy :

Composant Valeur MonitorBy Description
TADMoniFlatFileClientLink FlatFile Génère la sortie de suivi d'un fichier texte plat. Lorsque l'application a terminé, la liste des fichiers de suivi générés s'affiche.
TADMoniFlatFileClientLink Remote Génère la sortie de suivi de l'utilitaire FDMonitor et autorise la surveillance de l'application. FDMonitor doit être en cours d'exécution pour activer une sortie de suivi.
TADMoniFlatFileClientLink Custom Génère la sortie de suivi d'un gestionnaire d'événement personnalisé. Les applications doivent utiliser le gestionnaire d'événement OnOutput pour produire une sortie de suivi personnalisée.

Les composants moniteurs sont des "singleton" qui se réfèrent à l'instance unique de l'implémentation du programme de suivi correspondant. Toutes les connexions pour lesquelles la sortie de suivi est activée utilisent le même programme de suivi. Une seule sortie est donc produite pour toutes les connexions.

Contrôle du suivi

Pour activer la sortie de suivi sur une connexion :

  1. Déposez un composant TADMoniXxxxClientLink sur une fiche.
  2. Définissez sa propriété Tracing sur True.
  3. Ajoutez le paramètre de définition de la connexion MonitorBy=Xxx.

Le paramètre MonitorBy associe la définition à une méthode de suivi spécifique et devient accessible en lecture seule après la création de la première connexion pour cette définition. MonitorBy doit être défini de manière permanente.

La propriété TADMoniXxxxClientLink.Tracing doit être définie sur True avant d'ouvrir une première connexion avec MonitorBy=Xxx. Par la suite, pour désactiver ou activer temporairement la sortie de suivi sur toutes les connexions, utilisez la propriété Tracing du composant TADMoniXxxxClientLink.

Remarque : TADMoniXxxxClientLink doit précéder TFDConnection dans le module de données ou dans l'ordre de création de la fiche.

Pour désactiver initialement la sortie de suivi sur une connexion spécifique, utilisez MonitorBy=Xxx. Pour désactiver ou activer temporairement la sortie de suivi sur une connexion spécifique, définissez la propriété ADConnection.ConnectionIntf.Tracing. Sachez que la propriété ConnectionIntf est accessible uniquement après avoir établi la connexion.

Par exemple :

 ADMoniFlatFileClientLink.Tracing := True;
 
 with ADConnection1.Params do begin
   Clear;
   Add('DriverID=SQLite');
   Add('Database=c:\test.sdb');
   Add('MonitorBy=FlatFile');
 end;
 
 ADConnection1.Connected := True;
 ...
 // disable trace output for connection
 ADConnection1.ConnectionIntf.Tracing := False;
 ...
 // enable trace output for connection
 ADConnection1.ConnectionIntf.Tracing := True;

Contenu du suivi

Pour contrôler le contenu du suivi, utilisez la propriété TADMoniXxxxClientLink.EventKinds. Voici un exemple de sortie de suivi :

     1385 15:47:14.093     >> Fetch [ATable="ADQA_FK_tab", Command="SELECT AF.fk_id, AF.id, AT1.f1, AT1.f2
 FROM ADQA_FK_tab AF LEFT JOIN ADQA_tabwithpk AT1 ON AF.fk_id=AT1.f1"]
     1386 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=0, Result=SQLITE_NULL]
     1387 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=1, Result=SQLITE_INTEGER]
     1388 15:47:14.093          . sqlite3_column_int64 [stmt=$0F16E6B8, iCol=1, AValue^=2]
     1389 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=2, Result=SQLITE_NULL]
     1390 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=3, Result=SQLITE_NULL]
     1391 15:47:14.093          . sqlite3_step [stmt=$0F16E6B8]
     1392 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=0, Result=SQLITE_INTEGER]
     1393 15:47:14.093          . sqlite3_column_int64 [stmt=$0F16E6B8, iCol=0, AValue^=2]
     1394 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=1, Result=SQLITE_INTEGER]
     1395 15:47:14.093          . sqlite3_column_int64 [stmt=$0F16E6B8, iCol=1, AValue^=3]
     1396 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=2, Result=SQLITE_INTEGER]
     1397 15:47:14.093          . sqlite3_column_int64 [stmt=$0F16E6B8, iCol=2, AValue^=2]
     1398 15:47:14.093          . sqlite3_column_type [stmt=$0F16E6B8, iCol=3, Result=SQLITE_TEXT]
     1399 15:47:14.093          . sqlite3_column_text [stmt=$0F16E6B8, iCol=3, bytes=4]
     1400 15:47:14.093          . sqlite3_step [stmt=$0F16E6B8]
     1401 15:47:14.093          . profile [SQL="SELECT AF.fk_id, AF.id, AT1.f1, AT1.f2
 FROM ADQA_FK_tab AF LEFT JOIN ADQA_tabwithpk AT1 ON AF.fk_id=AT1.f1", time=0]
     1402 15:47:14.093     << Fetch [ATable="ADQA_FK_tab", Command="SELECT AF.fk_id, AF.id, AT1.f1, AT1.f2
 FROM ADQA_FK_tab AF LEFT JOIN ADQA_tabwithpk AT1 ON AF.fk_id=AT1.f1", RowsAffected=2]

Où :

  • Le premier numéro (1385 à 1402) est le numéro de ligne. Il permet de se référer à la ligne exacte.
  • L'horodatage correspond à l'heure locale à laquelle la ligne a été générée. Il peut être utilisé pour mesurer la performance.
  • Ces paramètres affichent le texte SQL de la commande et d'autres informations :
    • >> Xxxx -- démarrage d'une opération FireDAC
    • << Xxxx -- fin d'une opération FireDAC
  • sqlite3_xxx -- appel à l'API du SGBD (SQLite) visant à exécuter une opération FireDAC.

Contrôle de la sortie

Plusieurs composants contrôlent la sortie.

Sortie de suivi de fichier plat

Le composant TADMoniFlatFileClientLink contrôle la sortie de fichier texte plat. Par défaut, le nom du fichier de suivi est automatiquement généré dans le dossier TEMP de votre système. A la fin de l'exécution, une application FireDAC affiche la liste des fichiers de suivi générés.

Pour contrôler la sortie, utilisez les propriétés suivantes :

  • FileName -- nom du fichier de suivi. Il est possible d'utiliser des variables d'environnement de type $(name). La variable par défaut est $(TEMP)\traceN.txt.
  • FileEncoding -- encodage du fichier de suivi. L'encodage par défaut est ANSI.
  • FileAppend -- lorsque la valeur est True, le fichier de suivi existant est ajouté. Sinon, il est écrasé à chaque nouvelle exécution.
  • FileColumns -- les colonnes à inclure dans le fichier texte.

Sortie de suivi à distance

Le composant TFDMoniRemoteClientLink contrôle la sortie de suivi à distance. Utilisez l'utilitaire FDMonitor pour voir la sortie de suivi. Pour le suivi, FireDAC utilise le protocole de transport TCP/IP, de sorte que FDMonitor et l'application peuvent être exécutés sur différents systèmes dans un réseau. Cela s'applique également au développement Mac OS X , auquel cas l'application peut être exécutée dans sur le Mac tandis que FDMonitor est exécuté dans un environnement Windows.

Pour contrôler la sortie, utilisez les propriétés suivantes :

  • Host -- adresse IP de FDMonitor. L'adresse par défaut est localhost.
  • Port-- port IP d'écoute utilisé par FDMonitor. Par défaut, il s'agit du port 8050.
  • Timeout -- nombre maximal de ms autorisées pour établir une connexion avec FDMonitor.

Sortie de suivi personnalisée

Le composant TADMoniCustomClientLink peut être utilisé pour produire une sortie de suivi personnalisée. Pour ce faire, l'application doit définir un gestionnaire d'événement OnOutput.

Remarque : N'insérez pas d'appel à Application.ProcessMessages dans le gestionnaire d'événement OnOutput, cela pouvant réduire considérablement les performances et créer des problèmes (une nouvelle entrée dans FireDAC ne serait pas prise en charge).

Surveillance

L'utilitaire FDMonitor prend également en charge la surveillance de l'état des objets FireDAC. Les développeurs peuvent utiliser cette fonctionnalité pour activer la surveillance de leurs propres objets. Pour de plus amples informations, voir la démo FireDAC\Samples\Moni Layer\Main.

Vérification du texte de la commande SQL

Utilisez les capacités de suivi ci-après pour voir le texte de la commande SQL tel qu'il sera envoyé vers une base de données :

  • TADQuery.Text -- renvoie le texte de la commande SQL tel qu'il sera envoyé vers une base de données.
  • EADDBEngineException.SQL, Params -- renvoie le texte de la commande SQL ayant déclenché une exception.

Vérification des lignes de l'ensemble de données

Vous pouvez vider les lignes de l'ensemble de données en utilisant l'une des méthodes suivantes :

  • DataSet.GetRow.DumpRow(True) -- renvoie le texte correspondant à la ligne de l'ensemble de données en cours, y compris toutes les valeurs de champs et les noms des champs.
  • DataSet.GetRow.DumpRow() -- renvoie le texte correspondant à la ligne de l'ensemble de données en cours, y compris toutes les valeurs de champs.
  • DataSet.Table.Rows[i].DumpRow() -- renvoie le texte correspondant à une ligne aléatoire de l'ensemble de données.

Voir aussi