Es ist eine Abnahme der Nachrichtenflussleistung zu verzeichnen, wenn auf Nachrichtenbaumstrukturen mit vielen sich wiederholenden Datensätzen zugriffen wird

Im Foglenden wird beschrieben, wie Sie Leistungsprobleme in Nachrichtenbaumstrukturen beheben, die sich wiederholende Datensätze enthalten.

Vorgehensweise

  • Szenario: Die Nachrichtenflussleistung wird reduziert, wenn die folgenden Bedingungen zutreffen:
    • Es wird ESQL-Verarbeitung verwendet, um eine große Baumstruktur zu bearbeiten.
    • Die Nachrichtenbaumstruktur besteht aus sich wiederholenden Datensätzen oder vielen Feldern.
    • Sie haben explizite SET-Anweisungen mit Feldverweispfaden zum Erstellen oder Zugreifen auf die Felder verwendet.
    • Es ist eine allmähliche Verlangsamung der Nachrichtenflussverarbeitung zu beobachten, wenn ESQL mehr Felder oder Wiederholungen verarbeitet.
  • Erläuterung: Dieses Problem tritt auf, wenn Sie Feldverweise anstelle von Referenzvariablen verwenden, um auf aufeinanderfolgende Felder oder Datensätze zuzugreifen oder diese zu erstellen.

    Beachten Sie das folgenden Beispiel, in dem unabhängige SET-Anweisungen Feldverweispfade zum Bearbeiten der Nachrichtenbaumstruktur verwenden. Die Anweisung SET umfasst einen Quellen- und Zielparameter, wobei ein oder beide Parameter Feldverweise sind:

    SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field = '1';
    Das Problem tritt auf, wenn die SET-Anweisung dazu verwendet wird, um wesentlich mehr Felder zu erstellen; dies wird im folgenden Beispiel demonstriert:
    SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field1 = '1';
    SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field2 = '2';
    SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field3 = '3';
    SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field4 = '4';
    SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field5 = '5';
    In diesem Beispiel sind alle fünf erstellten Felder 'ParentA' untergeordnet. Bevor das angegebene Feld erstellt oder geändert werden kann, muss der Integrationsknoten die benannte Nachrichtenbaumstruktur durchsuchen, um dort den Punkt zu finden, der geändert werden muss. Zum Beispiel:
    • Um auf Feld 1 zuzugreifen, navigiert die SET-Anweisung zu 'ParentA' und dann zum ersten Feld, woraus sich zwei Navigationsschritte ergeben.
    • Um beispielsweise auf Feld 5 zuzugreifen, navigiert die SET-Anweisung zu 'ParentA' und durchläuft dann alle vorherigen Felder, bis sie schließlich Feld 5 erreicht, woraus sich sechs Navigationsschritte ergeben.
    Das Navigieren zu allen Feldern, die dem angegebenen Feld vorausgehen, führt letztlich zum Leistungsverlust.
    Sehen Sie sich nun ein Szenario an, in dem auf sich wiederholende Felder in einer Eingabenachrichtenbaumstruktur zugegriffen wird. Beispiel:
    DECLARE myChar CHAR;
    DECLARE thisRecord INT 0;
    WHILE thisRecord < 10000 DO
    	SET thisRecord = thisRecord + 1;
    	SET myChar = InputRoot.MRM.myParent.myRepeatingRecord[thisRecord];
    END WHILE;  
    Wenn die Indexschreibweise verwendet wird, muss die Verarbeitung bei Erhöhung des Zählers über alle vorhergehenden Felder navigieren, um das gewünschte Feld abzurufen; d. h. sie muss über die vorherigen Datensätze zählen, um zu dem Datensatz zu gelangen, der von der aktuell indexierten Referenz dargestellt wird.
    • Beim Zugriff auf 'InputRoot.MRM.myParent.myRepeatingRecord[1]' findet eine Navigation statt, um zum ersten Datensatz zu gelangen.
    • Beim Zugriff auf 'InputRoot.MRM.myParent.myRepeatingRecord[2]' finden zwei Navigationen statt, um zum zweiten Datensatz zu gelangen.
    • Beim Zugriff auf 'InputRoot.MRM.myParent.myRepeatingRecord[N]' finden N Navigationen statt, um zum Nten Datensatz zu gelangen.
    Daher beträgt die Gesamtzahl der Navigationen für diese WHILE-Schleife: 1 + 2 + 3 + .... + N, was nicht linear ist.
  • Lösung: Wenn Sie auf aufeinanderfolgende Felder oder Datensätze zugreifen oder diese erstellen, verwenden Sie Referenzvariablen.
    Wenn Sie Sie Referenzvariablen verwenden, navigiert die Anweisung zum übergeordneten Hauptelement, das einen Zeiger zum Feld in der Nachrichtenbaumstruktur verwaltet. Im folgenden Beispiel wird das ESQL gezeigt, mit dem die Anzahl an Navigationsschritten beim Erstellen neuer Ausgabenachricht-Baumstrukturfelder reduziert wird:
    SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field1 = '1';
    DECLARE outRef REFERENCE TO OutputRoot.XMLNS.TestCase.StructureA.ParentA;
    SET outRef.field2 = '2';
    SET outRef.field3 = '3';
    SET outRef.field4 = '4';
    SET outRef.field5 = '5';
    Beim Referenzieren sich wiederholender Eingabenachricht-Baumstrukturfelder könnten Sie den folgenden ESQL-Code verwenden:
    DECLARE myChar CHAR;
    DECLARE inputRef REFERENCE TO InputRoot.MRM.myParent.myRepeatingRecord[1];
    WHILE LASTMOVE(inputRef) DO
    	SET myChar = inputRef;
    	MOVE inputRef NEXTSIBLING NAME 'myRepeatingRecord';
    END WHILE;
    Weitere Informationen finden Sie unter Dynamische Feldreferenzen erstellen.