Ablaufverfolgung und Überwachung (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Debuggen und Support (FireDAC)


In diesem Thema werden die Ablaufverfolgungs- und Überwachungsmöglichkeiten von FireDAC beschrieben, aus denen sich das Haupttool zum Debuggen von FireDAC-Anwendungen zusammensetzt und die zeigen, wie Anwendungen mit Datenbanken kommunizieren.

Übersicht

Die FireDAC-Ablaufverfolgungsausgabe stellt ein detailliertes Protokoll der Kommunikation zwischen der FireDAC-Anwendung und der Datenbank-Software dar. Sie enthält Referenznummern, Uhrzeiten, API-Aufrufe, an eine Datenbank gesendeten SQL-Code, Datenaustausch mit Parameter- und Feldwerten, Fehler und Warnungen und den Umgebungsbericht des Datenbankmanagementsystems (DBMS).

FireDAC bietet 3 Methoden zur Ausgabe der Ablaufverfolgung, die durch verschiedene Komponenten und verschiedene Werte der MonitorBy-Verbindungsparameter gesteuert werden:

Komponente MonitorBy-Wert Beschreibung
TFDMoniFlatFileClientLink FlatFile Gibt die Ablaufverfolgung in einer linearen Textdatei aus. Beim Beenden der Anwendung wird die Liste der erzeugten Ablaufverfolgungsdateien angezeigt.
TFDMoniRemoteClientLink Remote Gibt die Ablaufverfolgung im Hilfsprogamm FDMonitor aus und ermöglicht die Überwachung der Anwendung. FDMonitor muss vor dem Aktivieren der Ablaufverfolgungsausgabe ausgeführt werden.
TFDMoniCustomClientLink Custom Gibt die Ablaufverfolgung in einer benutzerdefinierten Ereignisbehandlungsroutine aus. In Anwendungen muss die Ereignisbehandlungsroutine OnOutput verwendet werden, damit eine benutzerdefinierte Ablaufverfolgungsausgabe erzeugt werden kann.

Monitor-Komponenten sind Singletons, die auf eine einzelne Instanz der zugehörigen Ablaufverfolgungsimplementierung verweisen. Alle Verbindungen mit aktivierter Ablaufverfolgungsausgabe verwenden dieselbe Ablaufverfolgung, und eine einzige Ausgabe wird für alle Verbindungen erzeugt.

Steuern der Ablaufverfolgung

So aktivieren Sie die Ablaufverfolgungsausgabe für eine Verbindung:

  1. Legen Sie eine TFDMoniXxxxClientLink-Komponente auf einem Formular ab.
  2. Setzen Sie deren Eigenschaft Tracing auf True.
  3. Fügen Sie den Verbindungsdefinitionsparameter MonitorBy=Xxx hinzu.

Der Parameter MonitorBy ordnet die Definition einer bestimmten Ablaufverfolgungsmethode zu und kann nach dem Erstellen der ersten Verbindung für diese Definition nur noch gelesen werden (ist schreibgeschützt). MonitorBy sollte dauerhaft gesetzt werden.

Die Eigenschaft TFDMoniXxxxClientLink.Tracing muss vor dem Öffnen einer ersten Verbindung mit MonitorBy=Xxx auf True gesetzt sein. Verwenden Sie später die Eigenschaft Tracing der Komponente TFDMoniXxxxClientLink, um die Ablaufverfolgungsausgabe für alle Verbindungen zeitweise zu deaktivieren oder zu aktivieren.

Hinweis: TFDMoniXxxxClientLink sollte in der Datenmodul- oder Formularerstellungsreihenfolge vor TFDConnection kommen.

Verwenden Sie MonitorBy=Xxx, um die Ablaufverfolgungsausgabe anfänglich für eine bestimmte Verbindung zu deaktivieren. Setzen Sie die Eigenschaft TFDConnection.ConnectionIntf.Tracing, um die Ablaufverfolgungsausgabe für eine bestimmte Verbindung zeitweise zu deaktivieren oder zu aktivieren. Auf ConnectionIntf kann nur nach dem Herstellen der Verbindung zugegriffen werden.

Zum Beispiel:

 
FDMoniFlatFileClientLink1.Tracing := True;

with FDConnection1.Params do begin
  Clear;
  Add('DriverID=SQLite');
  Add('Database=c:\test.sdb');
  Add('MonitorBy=FlatFile');
end;

FDConnection1.Connected := True;
...
// disable trace output for connection
FDConnection1.ConnectionIntf.Tracing := False;
...
// enable trace output for connection
FDConnection1.ConnectionIntf.Tracing := True;

Der Inhalt der Ablaufverfolgung

Mit der Eigenschaft TFDMoniXxxxClientLink.EventKinds steuern Sie den Inhalt der Ablaufverfolgung. Im Folgenden finden Sie eine Beispielausgabe der Ablaufverfolgung:

     1385 15:47:14.093     >> Fetch [ATable="FDQA_FK_tab", Command="SELECT AF.fk_id, AF.id, AT1.f1, AT1.f2
 FROM FDQA_FK_tab AF LEFT JOIN FDQA_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  FDQA_FK_tab AF LEFT JOIN FDQA_tabwithpk AT1 ON AF.fk_id=AT1.f1", time=0]
     1402 15:47:14.093     << Fetch [ATable="FDQA_FK_tab", Command="SELECT AF.fk_id, AF.id, AT1.f1, AT1.f2
 FROM FDQA_FK_tab AF LEFT JOIN FDQA_tabwithpk AT1 ON AF.fk_id=AT1.f1", RowsAffected=2]

In dieser Ausgabe:

  • Gibt die erste Zahl (1385-1402) die Zeilennummer an, die auf die genaue Zeile verweist.
  • Gibt der Zeitstempel die lokale Zeit an, zu der die Zeile erzeugt wurde. Diese Angabe kann zur Messung der Leistung herangezogen werden.
  • Diese Parameter zeigen den SQL-Anweisungstext und andere Informationen:
    • >> Xxxx – Beginn einer FireDAC-Operation
    • << Xxxx – Ende einer FireDAC-Operation
  • sqlite3_xxx – DBMS-API-Aufruf (SQLite), der zur Durchführung der FireDAC-Operation ausgeführt wurde.

Steuern der Ausgabe

Es gibt mehrere Komponenten, mit denen der Ausgabe gesteuert werden kann.

Ausgabe in eine lineare Datei

Die Komponente TFDMoniFlatFileClientLink steuert die Ausgabe in eine lineare Textdatei. Standardmäßig wird der Name der Ablaufverfolgungsdatei automatisch im Ordner TEMP Ihres Systems generiert. Beim Beenden zeigt eine FireDAC-Anwendung die Liste der generierten Ablaufverfolgungsdateien an.

Mit den folgenden Eigenschaften können Sie die Ausgabe steuern:

  • FileName – Name der Ablaufverfolgungsdatei. Umgebungsvariablen, wie $(name), können verwendet werden. Der Standardname lautet $(TEMP)\traceN.txt.
  • FileEncoding – Codierung der Ablaufverfolgungsdatei. Die Standardcodierung ist ANSI.
  • FileAppend – bei True wird die vorhandene Ablaufverfolgungsdatei angehängt. Ansonsten wird sie bei jedem neuen Durchlauf überschrieben.
  • FileColumns – die Spalten, die in die Textdatei einbezogen werden sollen.

Remote-Ausgabe

Die Komponente TFDMoniRemoteClientLink steuert die Remote-Ablaufverfolgungsausgabe. Mit dem Hilfsprogramm FDMonitor können Sie die Ablaufverfolgungsausgabe anzeigen. FireDAC verwendet TCP/IP als Ablaufverfolgungstransport. Dadurch können FDMonitor und die Anwendung auf unterschiedlichen Systemen in einem Netzwerk ausgeführt werden. Dies gilt auch für die macOS Entwicklung, wobei die Anwendung auf dem Mac ausgeführt werden kann und FDMonitor in einer Windows-Box läuft.

Mit den folgenden Eigenschaften können Sie die Ausgabe steuern:

  • Host – IP-Adresse der FDMonitor-Box. Die Standardvorgabe ist "localhost".
  • Port – IP-Port, über den FDMonitor empfängt. Der Standardwert ist 8050.
  • Timeout – Maximal zulässige Anzahl an Millisekunden zum Herstellen einer Verbindung zu FDMonitor.

Benutzerdefinierte Ausgabe (Custom)

Mit der Komponente TFDMoniCustomClientLink kann eine benutzerdefinierte Ablaufverfolgungsausgabe erzeugt werden. Dafür muss die Anwendung eine OnOutput-Ereignisbehandlungsroutine definieren.

Hinweis: Vermeiden Sie in der OnOutput-Ereignisbehandlungsroutine Application.ProcessMessages aufzurufen, da dadurch die Leistung erheblich reduziert wird und Probleme verursacht werden können (aufgrund des möglichen FireDAC-Wiedereintritts, was nicht unterstützt wird).

Überwachung

Das Hilfsprogramm FDMonitor unterstützt auch die Überwachung des Status von FireDAC-Objekten. Entwickler können mit dieser Funktion die Überwachung eigener Objekte aktivieren. Details finden Sie in der Demo FireDAC\Samples\Moni Layer\Main.

Überprüfen des SQL-Anweisungstextes

Mit den folgenden Ablaufverfolgungsmethoden können Sie den SQL-Anweisungstext so anzeigen, wie er an eine Datenbank gesendet wird:

  • TFDQuery.Text – Gibt den SQL-Anweisungstext so zurück, wie er an eine Datenbank gesendet wird.
  • EFDDBEngineException.SQL, Params – Gibt den SQL-Anweisungstext zurück, der eine Exception ausgelöst hat.

Überprüfen der Datenmengenzeilen

Sie können die Datenmengenzeilen mit einer der folgenden Methoden auslesen:

  • DataSet.GetRow.DumpRow(True) – Gibt den Text zurück, der die aktuelle Datenmengenzeile, einschließlich aller Feldwerte und aller Feldnamen, darstellt.
  • DataSet.GetRow.DumpRow() – Gibt den Text zurück, der die aktuelle Datenmengenzeile, einschließlich aller Feldwerte, darstellt.
  • DataSet.Table.Rows[i].DumpRow() – Gibt den Text zurück, der eine zufällige Datenmengenzeile darstellt.

Siehe auch

Beispiele