[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Mar 2006
    Beiträge
    27

    WebService - SQL - SQL-Systemfehler - parallele Verarbeitung?

    Moin zusammen,

    ich dachte mir dieser Titel beschreibt das Problem besser - kann aber den vorherigen Thread nicht löschen - sorry...

    ich habe ein Problem, bei dem ich mich schwer tue den Ablauf in Worte zu fassen. Trotzdem hoffe ich, dass mir jemand aus der Beschreibung einen Tipp geben kann, der mich in der Analyse bzw. der Problem-Lösung weiterbringt.

    Mein SOAP-WebService beinhaltet mehrere Methoden, die Daten für das FrontEnd (.NetCore/C#/WCF-Client) bereitstellen.
    Hierfür werden - zum Teil sehr umfangreiche - SQL's (CTE) in einem RPG-Programm (embedded SQL) verwendet. Die Daten werden aus gleichnamigen Tabellen/Dateien in unterschiedlichen Bibliotheken ermittelt.
    Um zu vermeiden dass die SQL dynamisch als String aufbereitet werden müssen oder mit unterschiedlichen Bibliotheken dupliziert werden müssen, werden über den Abrechnungszeitraum gesteuert Alias's mit den erforderlichen Bibliotheken in QTEMP erstellt (aktuelle Periode / Vor-Periode / Archiv-Periode). Die Alias's werden zum Ende der Methode wieder gelöscht, da für die nächste Anfrage möglicherweise Daten aus einer anderen Periode ermittelt werden müssen.

    Wenn ich das richtig weiß wird für jeden WebService nur ein QZRCSRVS-Job gestartet, was dazu führt dass alle Aufrufe der Methoden des WebService in dem gleichen QZRCSRVS-Job laufen.
    Durch die ansteigende Anzahl User kommt es jetzt scheinbar zu Parallel-Verarbeitungen(???)
    Meine Vermutung ist nun, dass damit auch alle Methoden-Aufrufe die gleiche QTEMP und damit die gleichen Alias's nutzen, bzw. die Alias's löschen, während ein anderer Methoden-Aufruf diese noch verwendet.

    Der Fehler im JobLog zeigt sich wie folgt:

    Funktionsfehler X'1720' in Maschineninstruktion. Interne
    Speicherauszugs-ID ████████.
    *** DBOP open FAILED. Exception from call to SLICÜ ***.
    Interner Fehler im Abfrageprozessor.
    SQL-Systemfehler.
    Cursor CRSNEVGL nicht geöffnet.

    Leider lässt sich mit embedded SQL nicht einfach der Tabellen-Name als Variable zuordnen - wie es native möglich ist (dBeaver).

    Welche Möglichkeiten habe ich um eine fehlerfreie Parallel-Verarbeitung zu gewährleisten oder muss der Fehler doch anderswo liegen???

    Viele Grüße aus dem hohen Norden
    Wolfgang

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.234
    Konzeptioneller Fehler.
    Tabellennamen können eben nicht dynmaisch in statischen SQL-Anweisungen verwendete werden.
    In Clientanwendungen sind SQL's generell dynamisch. Statische SQL's kennt man da fast gar nicht.
    Es gibt da noch ein paar Altsprachen, wo dies ebenso gemacht wurde, in modernen ist das definitiv nicht mehr so.
    Du kannst aber relativ einfach aus statischen SQL's eben dynamische SQL's machen.
    Je Hostvariable ein "?" und beim Execute eben per Using wieder anfügen.
    Dabei kannst du den Tabellennamen halt wechseln.
    Alles andere macht hierfür eben keinen Sinn.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Nov 2020
    Beiträge
    327
    Wenn du via JDBC (oder eigentlich egal, da bei HTTP das gleiche ist) auf die IBM i zugreifst, so wird grundsätzlich versucht, den selben Job wiederzuverwenden.
    Jetzt kann es vorkommen, dass der gleiche Job von unterschiedlichen Requests verwendet wird.
    Du musst in deinem Request jedes mal sicher stellen, dass deine Umgebung (u.a. auch die QTEMP) sauber ist.
    Du darfst nicht darauf vertrauen, dass der nächste Request noch mit dem gleichen Job abgearbeitet wird.

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Andreas_Prouza Beitrag anzeigen
    Wenn du via JDBC (oder eigentlich egal, da bei HTTP das gleiche ist) auf die IBM i zugreifst, so wird grundsätzlich versucht, den selben Job wiederzuverwenden.
    Jetzt kann es vorkommen, dass der gleiche Job von unterschiedlichen Requests verwendet wird.
    Du musst in deinem Request jedes mal sicher stellen, dass deine Umgebung (u.a. auch die QTEMP) sauber ist.
    Du darfst nicht darauf vertrauen, dass der nächste Request noch mit dem gleichen Job abgearbeitet wird.
    Es ist schon ein wenig anders! Das entscheidende Kriterium ist die Connection. Jede Connection wird von genau einem Serverjob bedient, vom open bis zum close, da gibt es keine Überlappung. Nach dem close steht der Serverjob für die nächste connection bereit. Dabei werden keine offenen Cursor o.ä. vererbt, auf die QTEMP würde ich mich hier nicht verlassen (stellt für mich kein Problem dar, so etwas hat im SQL Umfeld nix verloren!).

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Was mir nicht klar ist, wann werden denn die Aliase in der QTEMP erstellt?
    In den embedded SQL Programmen vor dem Aufruf oder einmalig?
    Wie stellst Du denn überhaupt fest, welche Umgebung du aktuell hast und welche du brauchst?

    Durch die stateless Programmierung ist eben nicht sichergestellt, dass Du in den gleichen Job zurückkommst (auch wenn das vorrangig versucht wird). Ist der Job belegt, wird ein anderer freier Job genommen.

    M.E. hast Du eigentlich nur die Chance, jedes Mal zu prüfen welche Umgebung du hast, und falls die nicht passt, musst Du die Aliase neu erstellen und zwar so wie Du sie brauchst.

    Anstatt die komplexen SQL Statements direkt im (embedded SQL) Programm zu hinterlegen würde ich die komplexen Select-Statements in Views verpacken und die View für jede Umgebung, in der Du sie brauchst (mit den entsprechenden Bibliotheken anlegen - aktuelle Periode / Vor-Periode / Archiv-Periode) permanent erstellen. Wenn das Ganze auf Views reduziert ist, kannst Du deine Aliase ganz einfach bei Bedarf erstellen ... oder besser dynamisches SQL verwenden, das dann auf die richtige View zugreift.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.234
    Die Viewvariante kann für die Dynamik noch ergänzt werden.

    Wenn die SQL-Options auf Naming=*SQL stehen, wird ja bei unqualifizierten Zugriffen mit der Default-Collection (Current Schema) zugegriffen.
    Somit kannst du folgende Dinge tun:
    Je Tabellenvariante eine Lib anlegen, die die komplexe View (oder auch Views auf die Basistabellen) enthält.
    Im SQL greifts du ohne Lib auf diese Views zu, so dass Default Collection genommen wird.
    Zur Laufzeit kann man per "exec sql set current schema LibName;" den Default ändern, auf den dann der nächste Zugriff entsprechend umgeleitet wird.
    Alternativ bei Naming=*SYS, musst du "exec sql set PATH ...;" verwenden um die komplette Library-List zu ersetzen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... das zieht beides nicht für Objekte, die man bereits am Wickel hat. Erst mal müsste man überhaupt genauer klären, welches Problem man eigentlich lösen will, bevor man sagen kann, wie es gelöst werden könnte.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Jan 2007
    Beiträge
    905
    In dem Zusammenhang hätte ich noch ne Frage.
    Kann der Parameter Marker in einem dynamischen SQL auch auf den Dateinamen angewendet werden?

    Bis jetzt bin ich noch nicht darauf gekommen, ich beiss mir da die noch restlichen Zähne aus.

    p.s. Natürlich kann ich mir das SQL Statement auch ohne die Markers dynamisch zusammenbauen, die Frage zielt explizit auf den Marker.
    kf

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von camouflage Beitrag anzeigen
    Kann der Parameter Marker in einem dynamischen SQL auch auf den Dateinamen angewendet werden?
    Nein! Das ist quasi statisch, d.h. einmal aufbereitet und mehrfach (mit unterschiedlichen Parameter-Werten) verwendet.
    In diesem Fall kann die Datei sowenig über eine Variable gesteuert werden wie beim statischen SQL!
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.234
    Du kannst aber nach Änderung des Tabellennamens einen neuen Prepare absetzen.
    Die Parameterliste des "Execute/Open using" ändert sich da ja nicht.

    Nicht vergessen, vor dem Prepare statement noch ein Drop Statement zu verwenden.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Mar 2006
    Beiträge
    27
    Moin Birgitta,

    naja - ich wusste halt nicht dass mehrere Abrufe die gleiche Umgebung/den gleichen Job verwenden - somit hatte ich gar keine Prüfung auf bereits vorhandene Alias.

    Der Ablauf ist wie folgt:
    - die Methode im ServiceProgramm wird über den WebService aufgerufen und gibt den Parameter Periode
    - über die Periode wird die Bibliothek/das Schema zugeordnet (zu dem Zeitpunkt als Alias)
    - das SQL-Command wird ausgeführt
    - die Alias werden wieder gelöscht
    ...womit die aufgezeigten Probleme entstanden.

    Mit den Erkenntnissen aus dem Thread (danke für die Info's) habe ich auf eine Lösung mit user defined table functions gewechselt - damit muss ich Änderungen zwar in drei SQL durchführen, aber bei den komplexen SQL ist eine Konvertierung in ein dynamisches SQL eine tagfüllende Aufgabe und damit indiskutabel.

    Diese Lösung arbeitet (scheinbar) auch zuverlässig.
    Allerdings werden über die WebService-Aufrufe auch PDF-Dateien erzeugt und wenn dieser Abruf in größerer Zahl parallel erfolgt "macht das System scheinbar zu" weil es einen DDoS-Angriff vermutet und auch Abrufe (z.B. über SoapUI) liefern keine Daten...

    Vielleicht kannst du mir hier schon Informationen dazu geben - ich würde aber auch erstmal das Forum durchsuchen und ggf. einen neuen Thread aufmachen, um die Themen nicht zu vermischen

    Viele Grüße und viel Erfolg in Boston
    Wolfgang

  12. #12
    Registriert seit
    Nov 2020
    Beiträge
    327
    Zitat Zitat von wti Beitrag anzeigen
    Allerdings werden über die WebService-Aufrufe auch PDF-Dateien erzeugt und wenn dieser Abruf in größerer Zahl parallel erfolgt "macht das System scheinbar zu" weil es einen DDoS-Angriff vermutet und auch Abrufe (z.B. über SoapUI) liefern keine Daten...
    Hallo Wolfgang,
    Das hat aber nichts mit der Applikation zu tun.
    Das ist ein FW Thema, wenn diese tatsächlich wegen Vermutung eines DDoS Angriffs die Requests schliest, welches du am besten mit dem Netzwerk-Admin besprichst.
    Man muss in den FW Logs sehen können was genau da passiert und warum die Requests blockiert werden (wenn es tatsächlich von der FW blockiert wird).

    lg Andreas

Similar Threads

  1. Webservice per SQL abfragen
    By KM in forum NEWSboard Programmierung
    Antworten: 12
    Letzter Beitrag: 04-11-22, 06:41
  2. SQLCODE bei Verarbeitung mehrere SQL
    By Hawi in forum NEWSboard Programmierung
    Antworten: 26
    Letzter Beitrag: 04-11-21, 20:49
  3. Nachricht: [SQL0901] SQL-Systemfehler
    By mk in forum IBM i Hauptforum
    Antworten: 16
    Letzter Beitrag: 11-08-21, 07:40
  4. NET USE Systemfehler 64 Windows 10 Bitdefender
    By TheDevil in forum IBM i Hauptforum
    Antworten: 16
    Letzter Beitrag: 07-11-19, 11:52
  5. IP-Verarbeitung
    By Gimli in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 06-09-02, 11:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •