Offene Cursor unter Oracle 10g

Hallo Leute

Ich verwende ein Oracle 10g (10.2.0.2.0) als Datenbank in Kombination mit einer auf JAVA basierten Anwendung (Verbindung über JDBC, es werden die Treiber vom Client 10.1.0 verwendet - leider systemtechnisch nicht auf den gleichen Stand wie der Server bringbar). Das ganze läuft unter SuSE Linux Enterprise Server 9, 32 Bit Kernel.

Die Anwendung ist eine Speziallösung, die von einer Fremdfirma entwickelt wird. Zugriff auf den Sourcecode habe ich nur bedingt. Die Anwendung wurde um einige eigene Teile erweitert.

Mein Problem ist nun folgendes: Die Anwendung bekommt des öfteren die Fehlermeldung, dass die Anzahl der maximal offenen Cursor überschrittet ist. Derzeit ist für den Parameter „open_cursors“ der Wert 1000 eingestellt. Ich habe mal als Notlösung den Wert erhöht, was aber eher ein kaschieren des eigentlichen Problems für mich darstellt. Die Anwendung in dieser speziellen Konfiguration hat nämlich keine allzugrosse Benutzerlast, wesshalb meiner Meinung nach 1000 Cursor völlig ausreichen müssten.

Ich vermute also mal einen Programmierfehler und gehe davon aus, dass die Anwendung geöffnete Cursor nicht korrekt abschließt.

Ich kenne mich zwar relativ gut mit Oracle aus, muss jetzt aber passen, wenn es darum geht, wie Oracle mit Cursorn umgeht. Cursor werden meines Wissens für jedes SQL-Statement verwendet. Ich sehe auch die offenen Cursor und einen Teil des SQL-Statements in der v$open_cursor. Soweit so gut.

Meine spezielle Frage ist nun: Wann bzw. wie werden Cursor üblicherweise geschlossen? Ich sehe in der v$open_cursor nämlich relativ viele DML-Statements und habe naiverweise angenommen, dass deren Cursor spätestens beim Commit geschlossen wird. Dass die Anwendung aber derart viele uncommitierte DML-Statements offen hat, glaube ich eher nicht. Wie schaut es mit SELECTs aus? Statements, die ich mit SQL*Plus abgesetzt habe, sehe ich noch relativ lange in der v$open_cursor, selbst wenn ich nach dem SELECT explizit ein COMMIT mache.

Bezüglich JDBC: kann man davon ausgehen, dass der Cursor geschlossen wird, wenn ich sowohl resultset als auch statement normal schließe, nachdem ich ein Commit gemacht habe? Oder muss man da auf was aufpassen?

Kennt sich da jemand besser aus und kann mir mal einen Tipp geben? Bin auch froh über einen vernünftigen Link auf eine Seite, auf der das halbwegs brauchbar erklärt wird (mag aber nicht unbedingt das gesammte Handbuch von Oracle durchlesen müssen - das ist seeehr umfangreich und ich weiss ehrlich gesagt nicht, wonach ich darin suchen muss).

Grüsse und Dank für die Hilfe
Erwin

Hi!

Es gibt ca. 1.233.342 Möglichkeiten, warum die Cursor noch immer „offen“ sind; von Datenbank-/Instanz-/Session-/Transaktions-einstellungen (z.B. SESSION_CACHED_CURSORS) angefangen, bis hin zu „nicht ordentlich geschlossen“ - vor allem 10g hat hier standardmäßig äußerst viele „Hilfsdienste“ am Laufen, die ständig mitprotokollieren und was-weiß-ich-noch-alles und natürlich auch immer ihre eigenen Cursor offen haben …

Eine unangenehme Geschichte jedenfalls - aber wenn das Raufsetzen der Open-Cursors half und keine Side-Effects mitsich brachte, würde ich dies mal mittelfristig belassen und wenn dann mal Zeit ist (also irgendwann in 8 Jahren), dem Phänomen auf die Spur gehen …

Grüße,
Tomh