PDA

View Full Version : Embedded SQL in ILE RPG



400_programmer
22-02-07, 14:01
Hallo Zusammen,

ich habe da mal eine wichtige Frage und hoffe, dass ihr mir weiterhelfen könnt.

Ist es möglich im SQLRPGLE die Wartezeit für ein SQL Statement auf eine gewisse Zeit (Beispiel: 10 Sekunden) zu begrenzen? Ich möchte eine Fehlermeldung bzw. SQLCOD = 100 zurückbekommen, wenn das Statement (SELECT / UPDATE / INSERT / DELETE) länger als die angegebene Zeit benötigt.

Das Programm darf lediglich eine gewisse Zeit laufen, sollte es länger dauern, hab ich ein Problem.

Danke schon im Voraus für eure Ideen.

Gruß

Dennis

BenderD
22-02-07, 14:19
Hallo,

da gibt es zwei Einstellungen: der record wait der Datei (steht im default auf unsinnigen 60 sec) der zieht bei lock conditions und das query attribut (QRYTIMLMT) des Jobs, der zieht bei der (geschätzten) Dauer eines Statements. Was hast du eigentlich vor???????
10 sec. sind außerhalb eines Locks woanders zu heilen!!!

mfg

Dieter Bender


Hallo Zusammen,

ich habe da mal eine wichtige Frage und hoffe, dass ihr mir weiterhelfen könnt.

Ist es möglich im SQLRPGLE die Wartezeit für ein SQL Statement auf eine gewisse Zeit (Beispiel: 10 Sekunden) zu begrenzen? Ich möchte eine Fehlermeldung bzw. SQLCOD = 100 zurückbekommen, wenn das Statement (SELECT / UPDATE / INSERT / DELETE) länger als die angegebene Zeit benötigt.

Das Programm darf lediglich eine gewisse Zeit laufen, sollte es länger dauern, hab ich ein Problem.

Danke schon im Voraus für eure Ideen.

Gruß

Dennis

400_programmer
22-02-07, 15:04
Hallo,

danke für die schnelle Antwort.

Ok, ich versuche nochmal mein Problem etwas klarer zu schildern.

Ich arbeite in einem Filialunternehmen, in dem die Kassen Online auf unserer iSeries (V5R3) arbeiten. Bei einem Vorgang mit der Kasse habe ich da einige Probleme. Und zwar ruft die Kasse mein Programm auf und erwartet innerhalb 15 Sekunden eine Antwort von meinem Programm. Kommt diese Antwort nicht pünktlich, so bricht die Kasse den Vorgang entsprechend ab.

Nachdem mein Programm aufgerufen wird verbinde ich mich mit einer entfernten relationalen Datenbank und aktualisiert hier einige Werte. Später gebe ich dann der Kasse zurück, ob der Vorgang funktioniert hat oder nicht. Die Kasse kann somit entsprechend reagieren. Diese Antwort muss sie dafür allerdings erstmal erhalten. Daher hatte ich mir eigentlich gedacht, dass man in den SQL Options einen Maximal Wert setzen kann, wie lange die Anfrage dauern darf. Hat das SQL Statement die Anfrage in der Zeit noch nicht vollständig verarbeitet, wird ein entsprechender SQLCOD zurückgegeben. Leider finde ich keine passende Option und ich weiß auch nicht einmal, ob das überhaupt so möglich ist.

Reicht das an Informationen??

Gruß

Dennis

Fuerchau
22-02-07, 15:14
Für lokale Antworten bestimmt das QueryTimeLimit (CHGQRYA ... QRYTIMLMT) die maximale Antwortzeit.
Wobei hier der Optimizer leider etwas anderes tut als man erwartet.
Das QRYTIMLMT wird ausschließlich beim Open/Execute geprüft, ob die Abfrage ggf. länger dauern könnte.
Dauert die Abfrage dann tatsächlich länger, wartet SQL leider auch länger !

Bei einer entfernten DB ist hier die Art der Verbindung entscheidend.
Ist das Ziel eine AS/400 bestimmt das dortige QRYTIMLMT des dortigen Job's die maximale Antwortzeit, allerdings bezogen auf die DB.
Die Antwortzeit des Datentransfers wird hierbei nicht berücksichtigt !

Solche Sachen löst du dann besser über asynchrone Jobs und z.B. DTAQ's, die du dann per QRCVDTAQ und Timeout bearbeitest.

BenderD
22-02-07, 15:25
Hallo,

SQL stellt hierzu nichts bereit. Mir wird allerdings noch nicht ganz klar, was da innerhalb von 15 sec. nicht fertig wird - 15 Sekunden sind eine lange Zeit, das reicht für Tod und Teufel. Wenn denn da wirklich Transaktionen bei sind, die in 15 sec. nicht fertig werden, dann muss man das asynchron machen und RPG/COBOL würde ich dafür nicht nehmen, mit der Rückmeldung alleine ist es ja nicht getan, wenn ich das richtig verstehe, die Aktion soll ja dann auch nicht mehr stattfinden, bzw. abgebrochen und rückgängig gemacht werden.

mfg

Dieter Bender


Hallo,

danke für die schnelle Antwort.

Ok, ich versuche nochmal mein Problem etwas klarer zu schildern.

Ich arbeite in einem Filialunternehmen, in dem die Kassen Online auf unserer iSeries (V5R3) arbeiten. Bei einem Vorgang mit der Kasse habe ich da einige Probleme. Und zwar ruft die Kasse mein Programm auf und erwartet innerhalb 15 Sekunden eine Antwort von meinem Programm. Kommt diese Antwort nicht pünktlich, so bricht die Kasse den Vorgang entsprechend ab.

Nachdem mein Programm aufgerufen wird verbinde ich mich mit einer entfernten relationalen Datenbank und aktualisiert hier einige Werte. Später gebe ich dann der Kasse zurück, ob der Vorgang funktioniert hat oder nicht. Die Kasse kann somit entsprechend reagieren. Diese Antwort muss sie dafür allerdings erstmal erhalten. Daher hatte ich mir eigentlich gedacht, dass man in den SQL Options einen Maximal Wert setzen kann, wie lange die Anfrage dauern darf. Hat das SQL Statement die Anfrage in der Zeit noch nicht vollständig verarbeitet, wird ein entsprechender SQLCOD zurückgegeben. Leider finde ich keine passende Option und ich weiß auch nicht einmal, ob das überhaupt so möglich ist.

Reicht das an Informationen??

Gruß

Dennis

400_programmer
23-02-07, 08:01
Ja, das siehst du vollkommen richtig.


wenn ich das richtig verstehe, die Aktion soll ja dann auch nicht mehr stattfinden, bzw. abgebrochen und rückgängig gemacht werden.


Leider muss ich dir wiedersprechen, dass die 15 Sekunden tatsächlich immer ausreichen. Es ist einfach schon zu oft vorgekommen, dass irgendwelche Netzwerkprobleme die Anfragen auf die Datenbank so verlangsamt haben, dass die 10 Sekunden Grenze bereits vermehrt überschritten wurde.

An RPG + embedded SQL bin ich auf jeden Fall gebunden, so dass ich dann leider eine andere Lösung finden muss.

Gruß

Dennis Reßmann

BenderD
23-02-07, 08:26
Hallo,

irgendwelche Netzwerkprobleme klingt für mich nach: "wir tappen da völlig im Dunkeln". Was wird denn da genau gemacht? 15 Sekunden das reicht normal für einige Tausend Dateioperationen; eine der wahrscheinlichen Ursachen können durchaus (vermeidbare) Sperrkonflikte oder (leicht heilbare) fehlende Zugriffspfade sein. Habt ihr denn mal mit dem Database Monitor Ursachenforschung betrieben, was da eigentlich abgeht?
Was die originäre Anforderung angeht, das ist ohne Multithreading fast nicht abzubilden, es sei denn um einen relativ hohen Preis.

mfg

Dieter Bender


Ja, das siehst du vollkommen richtig.



Leider muss ich dir wiedersprechen, dass die 15 Sekunden tatsächlich immer ausreichen. Es ist einfach schon zu oft vorgekommen, dass irgendwelche Netzwerkprobleme die Anfragen auf die Datenbank so verlangsamt haben, dass die 10 Sekunden Grenze bereits vermehrt überschritten wurde.

An RPG + embedded SQL bin ich auf jeden Fall gebunden, so dass ich dann leider eine andere Lösung finden muss.

Gruß

Dennis Reßmann