-904 bei Stored Procedure Aufruf im Batch
- Dieses Thema hat 19 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 18 Jahre vonMitglied.
- AuthorPosts
- 11. Januar 2005 um 15:51 Uhr #2496
Hallo zusammen,
wir haben in dieser Woche zum ersten mal eine Stored Procedure (im weiteren Text SP genannt) aus einem Batch-Programm über 2000 mal aufgerufen (EXEC SQL CALL SP etc.).
Bei diesem Lauf des PGM’s war die Eingabedatei außergewöhnlich groß, so daß diese Menge an Aufrufen der SP entstand.
Das Batch-Programm macht in seiner Verarbeitung keine COMMITs.
Bei dem 2001 Aufruf bekamen wir folgende Fehlermeldung:DSNT408I SQLCODE = -904, ERROR: UNSUCCESSFUL EXECUTION CAUSED BY AN
UNAVAILABLE RESOURCE. REASON 00E70082, TYPE OF RESOURCE 3002,
AND RESOURCE NAME NUMBER OF STORED PROCEDURES
DSNT418I SQLSTATE = 57011 SQLSTATE RETURN CODE
DSNT415I SQLERRP = DSNXERT2 SQL PROCEDURE DETECTING ERROR
DSNT416I SQLERRD = -258 0 0 -1 0 0 SQL DIAGNOSTIC INFORMATION
DSNT416I SQLERRD = X’FFFFFEFE‘ X’00000000′ X’00000000′
X’FFFFFFFF‘ X’00000000′ X’00000000′ SQL DIAGNOSTIC
INFORMATIONDie Messages und Codes sagen hierzu:
4.22.19 00E70082
00E70082
Explanation: The user has reached the maximum number of outstanding stored procedures or opened cursors for the current thread.
System Action: No additional stored procedures may be invoked, and no more cursors are allowed to be opened.
Programmer Response: Applications should close cursors as soon as possible, and should issue COMMIT often to allow the stored
procedure result set to be cleared.Jetzt die Frage:
Ist man gezwungen in einem Batch-Programm, dass SPs wie oben beschrieben intensiv nutzt, COMMITs zu machen?
Das würde für uns bedeuten, dass wir das BATCH-Programm auf ein Check-Point-Restart-Verfahren erweitern müßten. (Wollen wir aber nicht, weil zu viel Arbeit ;)).
Da das Programm in der Nacht, läuft sind die Sperren in der Datenbank für uns kein Problem.
Für jeden TIP sind wir dankbar.
mfG
Klaus
12. Januar 2005 um 9:14 Uhr #2957Hallo Klaus,
ich vermute, die SP liefert ein oder mehrere Result Sets als Ergebnis?
Falls ja, stellen diese Cursors da, die sich dann meines Wissens wirklich nur über Commits schliessen lassen.
Einen Commit könnte man evtl. vermeiden, wenn die SP ihre Ergebnisse in einer Session Table ablegen würde (vorausgesetzt, das Ergebnis ist nicht zu gross) und diese von der Applikation ausgelesen würde.Gruss,
Alex12. Januar 2005 um 10:11 Uhr #3284Hallo Alex,
wir werden jetzt prüfen, ob wir tatsächlich result sets verwenden (wollten wir eigentlich nicht bei diesem Aufruf 🙂 ).
Sobald ich mehr herausbekommen habe melde ich mich nochmal.
Besten Dank schon mal für Deinen Hinweis
Gruß Klaus
12. Januar 2005 um 11:53 Uhr #3497CLOSE Cursor im rufenden Programm sollte auch dann funktionieren, wenn der Cursor in einer SP geöffnet wurde und das ResultSet mit ASSOCIATE LOCATOR bzw. ALLOCATE CURSOR FOR RESULT SET übergeben wurde.
17. Januar 2005 um 13:40 Uhr #3637Hallo zusammen,
wir haben die Sache nochmal geprüft.
Die Definition der SP beinhaltet ein result set wie man hier sehen kann:
CREATE PROCEDURE XXXX.OTTO
( IN I_PARAM1 CLOB (1 M)
, IN I_PARAM2 CLOB (1 M)
, IN I_PARAM3 CLOB (1 M)
, IN I_PARAM4 CLOB (32 K)
, IN I_PARAM5 CLOB (32 K)
, OUT O_PARAM1 CLOB (1 M)
, OUT O_PARAM2 CLOB (15 M)
, OUT O_PARAM3 CLOB (15 M)
, OUT O_PARAM4 CLOB (15 M)
, OUT O_PARAM5 CLOB (32 K)
, OUT O_PARAM6 CLOB (32 K)
)
LANGUAGE COBOL
PARAMETER STYLE GENERAL
MODIFIES SQL DATA
EXTERNAL NAME OTTO
RESULT SETS 1
RUN OPTIONS ‚MSGFILE(SYSOUT,,,,ENQ)‘
;Da die SP jedoch bei unserem Aufruf diesen Cursor nicht öffnet, verstehen wir nicht warum wir den Fehler bekommen.
Wir haben durch DISPLAYs sichergestellt, dass der einzige CURSOR, der WITH RETURN definiert ist, nicht genutzt wird. Die DISPLAYs sind vor und nach den entsprechenden DECLARE + PREPAREs + OPEN etc. positioniert.
Wo könnte der Fehler stecken?
Was können wir noch prüfen?Besten Dank im voraus
Gruß Klaus
17. Januar 2005 um 14:30 Uhr #3742Hab grad was im Installation Guide gefunden.
Im Panel DSNTIPX gibt es unter Punkt 8 den Punkt:
MAX STORED PROCS.
Damit wird angegeben, wieviele stored procedures maximal pro thread erlaubt sind. Der Defaultwert liegt bei 2000.Schau mal in dieser Richtung weiter …
17. Januar 2005 um 14:58 Uhr #3810Hallo Ulrich,
genau das war unsere Befürchtung.
Man kann also eine SP nicht im BATCH-Umfeld intensiv nutzen (mehr als 2000 Aufrufe (Default V8 )bzw. mehr als 32000 Aufrufe (fixer Wert in V7)), ohne COMMIT-Logik.
Und das bedeutet für uns, dass wir in das BATCH-PGM eine CHECKPOINT-RESTART-LOGIK einbauen müssen.
Leider.
Ich möchte nicht bestreiten, dass CHECK-POINT-RESTART-Logik bei Massenverarbeitung sinnvoll ist.
Es ist aber trotzdem schöner wenn man selber entscheiden kann, wann man so etwas nutzt und es nicht von DB2 auferlegt bekommt. (wie in unserem Fall)
Bei normalen COBOL-CALLs auf ein UPRO gibt es die Restriktion auch nicht.
Warum muß dass dann bei
EXEC SQL
CALL OTTO etc.
END-EXEC
so sein?
Gruß Klaus
17. Januar 2005 um 15:03 Uhr #3853Du kannst natürlich den Wert im Installationspanel höher setzen.
Allerdings verwendet Deine Prozedur
"MODIFIES SQL DATA". Da stored procedures in einem anderen Adressraum ausgeführt werden, bedeutet das, dass alles mit TWO-PHASE-COMMIT koordiniert werden muss, und dies jede Menge Ressourcen erfordert.(hier liegt auch der Unterschied zum "normalen" COBOL Call Upro, der ja im gleichen Adressraum ausgeführt wird).
18. Januar 2005 um 15:34 Uhr #3884Hallo zusammen,
ich wollte euch mal von unseren frustrierenden Erfahrungen berichten.
Wir haben jetzt COMMITs nach jedem Aufruf der SPs eingebaut. Wir hatten damit gehofft den -904 endgültig loszuwerden.
Nach ca 20 Minuten Batchlaufzeit bekommen wir immer noch den ursprünglichen -904.
Der Parameter MAX STORED PROCS steht auf 2000.
Der Parameter MAX OPEN CURSORS steht auf 500.Mit OMEGAMON DB2 haben wir das Trauerspiel beobachtet. Kurz vor dem -904 zeigt die SQL-Übersicht:
COMMIT 680
OPEN CURSOR 5278
CLOSE CURSOR 5278
SET HOST VAR 11061
SELECT 153452
FETCH 320948
UPDATE 2196
PREPARE 4942
HOLD LOCATOR 0
Assoc Locator 0SQL CALL Statements 5024 (Sollte eigentlich mit MAX STORED PROCS korrespondieren)
Stored Proc SQL Reqs 507145 (SQLs innerhalb von SPs)Unsere DBAs suchen noch nach dem Fehler.
Im Installation guide V8 habe ich noch folgende Aussage gefunden:
MAX STORED PROCS
Specify the maximum number of stored procedures per thread. If an application attempts to call a stored procedure after the maximum is reached,
the statement will fail.In a data sharing group, this parameter has member scope.
Hier steht ja nichts von COMMIT sondern nur von THREAD.
Das würde bedeuten das Batchverarbeitung mit SPs grundsätzlich nicht möglich ist. Den THREAD kann ich ja nicht beenden, bevor mein Batch-PGM beendet ist.Sagt mir bitte dass das so nicht stimmt.
Für jeden Hinweis woran das hier liegen könnte bin ich dankbar.
Macht jemand von euch Massenverarbeitung mit SPs?
Gruß Klaus
20. Januar 2005 um 15:13 Uhr #3908Commit nach jedem Aufruf der Stored Procedure eingebaut ?
Anzahl CALLs: Â Â Â 5024
Anzahl COMMITs: Â 680das kann irgendwie nicht sein.
Vielleicht wurden seit dem letzten Commit mehr als 2000 SP aufgerufen ?
oder innerhalb der SP wurden Cursor mit WITH HOLD WITH RETURN definiert und nicht explizit geschlossen ?
20. Januar 2005 um 16:28 Uhr #3921Hallo Ulrich,
PGM-Struktur ist ungefähr wie folgt:
Batch-PGM ruft SP1
Schleife-Anfang:
Batch-PGM ruft SP2 ==>
SP2 ruft ==> SP3
SP3 ruft (3-4mal) => SP1<==============================
INSERT in T1 ==> TRIGGER auf T1 ruft ==> SP4COMMIT
Schleife-EndeDarum machen wir ca. alle 8 SP-Calls einen Commit.
Result-Cursor (with hold with return) machen wir auch nicht auf.
Gruß Klaus
21. Januar 2005 um 7:36 Uhr #3932Hi,
so aus der Ferne (weit weg von DB2_Manuals etc): Ist ein rekursiver Aufruf einer St.Proc. unter z/OS erlaubt?
MfG
AxelP
21. Januar 2005 um 8:00 Uhr #3941@ AxelP:
Seit Version 6 darf eine Routine eine andere Routine aufrufen. (maximal 16 Stufen ).
SPs dürfen dabei nicht mit COMMIT ON RETURN definiert sein und müssen im gleichen Adresstraum-Typ ( also WLM oder SPAS ) laufen.Eine Rekursion ( eine SP ruft sich direkt oder indirekt selbst auf ), sehe ich bei obigem Ablauf nicht.
21. Januar 2005 um 8:08 Uhr #3949@ Klaus
Die SQL-Übersicht lt. Omegamon zeigt keinen INSERT an.
Ist es möglich, dass es der erste Insert war ( und zum ersten mal der Trigger die SP4 gefeuert hat ) bevor es zum -904 kam ?Könnte theoretisch ein FOR EACH ROW trigger und ein Masseninsert mit mehr als 2000 Zeilen das SP-limit sprengen ?
21. Januar 2005 um 12:02 Uhr #3955Ich habe die Abfolge so verstanden, daß in SP1 eine Schleife beginnt, in der SP3 3-4mal SP1 aufruft. Vielleicht habe ich den Ablauf falsch interpretiert.
In der Schachtelungstiefe von 15 zählen auch Trigger und UDFs mit, sie beschränkt sich nicht auf SPs alleine.
AxelP
- AuthorPosts
You must be logged in to reply to this topic.