[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Sep 2012
    Beiträge
    53

    SQLRPGLE Get und Set Prozeduren

    Guten Morgen zusammen,

    In Java gibt es beim Zugriff auf Objekte Get und Set Methoden.
    Wir wollen so etwas für unsere Dateien als Serviceprogramm einführen.

    Man soll also einzelne Felder aus einer Datei mit Get_FELD1 auslesen können. Als Übergabe erhält die Prozedur den Eindeutigen Schlüssel. In der Prozedur Get_FELD1 wird dann ein entsprechender SQL ausgeführt und der Wert mit Return zurück gegeben.

    Wie sieht es mit der Performance aus, wenn ich aus einer Datei hintereinander 3 Felder abgreife?
    Also ein Get_FELD1 dann Get_FELD2 und Get_FELD3 aus einer Datei mit dem selben Schlüssel.
    Muss dann jedesmal ein Zugriffspfad aufgebaut werden?

    Es läuft in der selben Aktivierungsgruppe.


    Danke für eure Hilfe
    iseries_user

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Der Zugriffspfad (ODP) bleibt nach dem 2. mal geöffnet.
    Ab 7.1 gibt es sogar einen QAQQINI Eintrag mit dem angegeben werden kann, ab dem wievielten mal öffnen der ODP offen bleiben soll.

    Du kannst es prüfen in dem du entweder
    * den Debug Mode mit laufen lässt (STRDBG) und dann ins Joblog schaust. Dort steht dann drinnen ob der ODP neu erstellt oder wiederverwendet wurde
    * oder du ein DB Monitor startest. Dort siehst du auch ob ein oder mehrere "hard open" gemacht werden.

    lg Andreas

  3. #3
    Registriert seit
    Sep 2012
    Beiträge
    53
    Super.

    Vielen Dank. Einfach schlau die AS/400

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... das ist natürlich weniger als die halbe Wahrheit. Das wäre sehr wohl Performance relevant und im wirklichen Leben macht man das so, wie Java das auch macht. Die getter und setter in Java beziehen sich immer auch Objekte, im Allgemeinen also nicht auf elementare Variablen. In Java wäre das dann ein Kunde, oder ein Auftrag. Im ersten Fall (Kunde) dann ein einzelner Datensatz, im zweiten Fall ein kompletter Auftrag, also sowohl der Kopfsatz, als auch alle Positionen und alle ausnormaliserten Daten hinzugezogen.
    Performance gewinnt man in SQL durch mehr Grobkörnigkeit, also gerade nicht Zugriffe auf einzelne Columns, sondern denkein in Ergebnismengen, was dann die Anzahl der Datenzugriffe (fetch) gegenüber Leseoperationen im RLA drastisch verringert!

    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 2003
    Beiträge
    1.508
    Nachtrag: die DB schließt den ODP automatisch von selbst wenn bestimmte Kriterien erfüllt werden.
    Z.B. Wenn also ein ALTER TABLE abgesetzt wird, werden alle ODPs (die von SQL offen gehalten werden) automatisch geschlossen um die Sperren aufzuheben.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Die Performance auf diese Art mit einzelnen SQL's zu lösen ist wirklich grottenschlecht.
    Ich habe das für einen Kunden realisiert (es wurde als SQL-Funktion benötigt) und musste hier dramatische Einbußen hinnehmen.
    In Java ist es so, dass ich einen Datensatz lese und mit den entsprechenden GetSet-Methoden nur noch auf Speicherobjekte zugreife. Ein SQL wird da nicht mehr ausgeführt.
    Möchtest du das dynamisch in einer ILE-Prozedur analog betreiben musst du den Datansatz per SQL komplett einlesen und dir eine Tabelle der Feldnamen mit den Werten dazu aufbauen (das geht auch dynamisch). Dann stellst du eine "READ"-Funktion zur Verfügung, die ggf. über den Schlüssel cached und einzelne Get/Set's für die Feldinformationen.
    Um es mit dem Begriff "Streng typisierte Objekte" zu vergleichen müsstest du real für jedes Feld einen namentlichen Get/Set-Zugriff generieren, also GetKundenNr/SetKundenNr, GetName1/SetName1, ...
    Da ILERPG aber nicht objektorientiert ist kann man solche Ansätze eher in die Tonne drücken da sie weder performant noch hilfreich sind.
    Ein simpler Zugriffshandler für komplette Strukturen mit diversen Zugriffen ist da allemal effektiver und logischer.
    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
    Jan 2012
    Beiträge
    1.120
    Eine Idee, um die möglicherweise suboptimale Performance zu verbessern, wäre es, wenn sich deine Procedure merkt, wie der Schlüssel beim letzten Aufruf war. Dann könntest du nur beim ersten Aufruf den gesamten Datensatz holen und in eine extern definierte Datenstruktur schreiben. Alle Folgeaufrufe mit gleichem Schlüssel würden dann kein eigenes SQL mehr ausführen, sondern einfach das Feld aus dem bereits geholten Datensatz zurückgeben.

    Dieter

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... nuir mal selber vergleichen:
    Variante 1: sql Zugriff pro Feld
    Variante 2: sql Zugriff pro Datensatz
    Variante 3: Blockfetch in ArrayDS für kompletten Auftrag mit allen Joins!!!

    natürlich kann eine Serviceprogramm dann das alles in calls auf getXYZ für jedes Feld auflösen, aber die Programmierer Performance wäre katastrophal - das will doch alles getippt werden!!!

    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/

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Nun, vielleicht fällt da einem ein Generator für so einen Quatsch ein.
    Zu bedenken ist ja noch folgendes:
    Ein Serviceprogramm wird ja innerhalb des Jobs von verschiedenen Programmen aufgerufen.
    Also nur simple Get/Set-Routinen reichen da nicht aus, da der "aktuelle" Datensatz inzwischen gewechselt sein könnte.
    Wer es denn kompliziert mag, kann noch D*B's Hashtable-Implementation verwenden um je Programm per zusätzliche Id auf den jeweils gecachten Satz zuzugreifen.
    Wer dabei allerdings noch den Überblick behalten will...
    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

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... dafür würde ich aber (m)einen echten cache nehmen, der ist aber (noch) nicht Open Source.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Ob ich das dann noch allgemeingültig verwenden würde...
    Für die Infor-XPPS-Anwendung habe ich für einige Dateien (Tabellen, Steuerwerte o.ä.) einen internen Cache eingerichtet. Der Vorteil hier war, dass es für die Dateien Filehandler gibt und die Inhalte weitgehend statisch sind sowie nur lesend verwendet werden.
    Die Programme sind per CVTRPGSRC in ILE (incl. Copy!) konvertiert.
    Dann wird in einer Tabelle der Schlüssel und Datensatz beim 1. Zugriff gespeichert und mit jedem weiteren Zugriff aus der Tabelle geladen.
    Dies hat die Zugriffe auf die Dateien erheblich reduziert und die Laufzeit um Faktor 20 verkürzt.
    Dabei habe ich mir nicht die Mühe gemacht, die Tabellen noch zu optimieren um einen %lookupeq() zu verwenden. Aber da könnte man sicherlich noch ein paar Millisekunden rausholen.
    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

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... Problem ist beim generischen cache die Keygröße, da man aber meist keine eindeutige Zuordnung braucht, genügt ein Hash (bei Kollision wird einfach verdrängt).
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Fully Free und SQLRPGLE
    By dschroeder in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 18-12-15, 12:01
  2. Interne Prozeduren mit DFTACTGRP
    By DEVJO in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 16-09-15, 13:14
  3. SQLRPGLE und Printerfile
    By Toschie in forum IBM i Hauptforum
    Antworten: 12
    Letzter Beitrag: 02-02-15, 14:28
  4. Probleme mit SQL-Prozeduren
    By AnjaS in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 16-01-03, 09:18
  5. Compilierung SQLRPGLE
    By B.Hauser in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 01-10-01, 17:31

Berechtigungen

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