sql >> Base de Datos >  >> RDS >> Oracle

Oracle no elimina los cursores después de cerrar el conjunto de resultados

El parámetro init.ora open_cursors define el máximo de cursores abiertos que una sesión puede tener a la vez. Tiene un valor por defecto de 50. Si la aplicación supera este número se lanza el error "ORA-01000:máximo de cursores abiertos excedidos".

Por lo tanto, es obligatorio cerrar los recursos JDBC cuando ya no se necesiten, en particular java.sql.ResultSet y java.sql.Statement. Si no están cerrados, la aplicación tiene una fuga de recursos.

En caso de reutilizar el objeto Conexión, debe tener en cuenta el hecho de que los cursores de Oracle abiertos se mantienen abiertos y en uso mientras exista la conexión y la transacción no ha terminado. Cuando la aplicación se confirma, los cursores abiertos se liberan.

Por lo tanto, como diseñador de aplicaciones, debe conocer una estimación aproximada de los cursores abiertos necesarios para su transacción más compleja.

La dificultad radica en la incapacidad de las vistas de parámetros internos de Oracle (v$open_cursor, v$sesstat, et. al.) para mostrar la diferencia entre los cursores abiertos, que son reutilizables y los cursores abiertos, que aún están bloqueados (¡no reutilizables!) por un ResultSet o Declaración sin cerrar. Si cierra todos los objetos Statement y ResultSet en su bloque finalmente, su aplicación está perfectamente bien.

Ajustar el parámetro init.ora funciona así (nuestra aplicación necesita 800 cursores como máximo)

ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;