Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle entfernt keine Cursor nach dem Schließen der Ergebnismenge

Der init.ora-Parameter open_cursors definiert die maximale Anzahl geöffneter Cursor, die eine Sitzung gleichzeitig haben kann. Er hat einen Standardwert von 50. Wenn die Anwendung diese Zahl überschreitet, wird der Fehler „ORA-01000:maximum open cursors ended“ ausgegeben.

Daher ist es zwingend erforderlich, die JDBC-Ressourcen zu schließen, wenn sie nicht mehr benötigt werden, insbesondere java.sql.ResultSet und java.sql.Statement. Wenn sie nicht geschlossen werden, hat die Anwendung ein Ressourcenleck.

Im Falle der Wiederverwendung des Verbindungsobjekts müssen Sie sich darüber im Klaren sein, dass die geöffneten Orakel-Cursor offen gehalten und verwendet werden, solange die Verbindung besteht und die Transaktion ist noch nicht beendet. Wenn die Anwendung festschreibt, werden die geöffneten Cursor freigegeben.

Daher müssen Sie als Anwendungsdesigner eine grobe Schätzung der benötigten offenen Cursor für Ihre komplexeste Transaktion kennen.

Die Schwierigkeit liegt in der Unfähigkeit der Oracle-internen Parameteransichten (v$open_cursor, v$sesstat, et. al.), den Unterschied zwischen geöffneten Cursorn, die wiederverwendbar sind, und geöffneten Cursorn, die noch blockiert (nicht wiederverwendbar!) sind, anzuzeigen ein nicht geschlossenes ResulSet oder Statement. Wenn Sie alle Statement- und ResultSet-Objekte in Ihrem finally-Block schließen, ist Ihre Anwendung vollkommen in Ordnung.

Das Anpassen des init.ora-Parameters funktioniert so (unsere Anwendung benötigt maximal 800 Cursor)

ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;