ORA-01000: maximum open cursors exceeded - numero máximo de cursores abiertos excedido
El error mencionado se debe a diferentes causas, entre las mas comunes, y el orden de pasos para solucionarlos están los siguientes:
1- Puede que nuestra variable de base de datos OPEN_CURSORS este muy pequeña y haya la necesidad de aumentarla, esta variable es el numero máximo de cursores que puede abrir una sesión podemos aumentar su tamaño de la siguiente forma:
ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;
se aconseja siempre para aplicativos de gran concurrencia de usuarios y transito de datos usar el OPEN_CURSORS en 400.
2- Si después de aumentar OPEN_CURSORS a 400 el problema persiste, es necesario que revise detenidamente el código de la aplicación, especialmente fíjese en los métodos que usan ResultSet, Statement, DBConecction etc... en muchos casos solo cerramos el objeto principal y dejamos abiertos los demás por ejemplo:
Como podemos observar cerramos el ResultSet, pero el Statement sigue abierto el cual va dejando cursores abiertos.
En otros casos usamos un try con recursos propios y lo hacemos de la siguiente manera:
como sabemos el try con recursos propios cierra sus recursos al finalizar el método, pero es necesario que definamos cada recurso por separado, ya que como esta en el ejemplo anterior solo se cierra el ResultSet y el Statement queda abierto.
La forma correcta debería ser:
Como podemos observar hemos separado el ResultSet del Statement, ahora el try hará el close de cada uno, el DBTransaction se encarga de cerrarlo el servidor de aplicaciones, en mi caso glassfish.
( psdt: esta es la forma mas actual de realizar autoclose, podemos realizar un close manual usando un finally despues del catch, pero tambien debe ser por separado Statement.close(); ResultSet.close() )
Espero les sea útil y de ayuda.
Slds.
1- Puede que nuestra variable de base de datos OPEN_CURSORS este muy pequeña y haya la necesidad de aumentarla, esta variable es el numero máximo de cursores que puede abrir una sesión podemos aumentar su tamaño de la siguiente forma:
ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;
se aconseja siempre para aplicativos de gran concurrencia de usuarios y transito de datos usar el OPEN_CURSORS en 400.
2- Si después de aumentar OPEN_CURSORS a 400 el problema persiste, es necesario que revise detenidamente el código de la aplicación, especialmente fíjese en los métodos que usan ResultSet, Statement, DBConecction etc... en muchos casos solo cerramos el objeto principal y dejamos abiertos los demás por ejemplo:
public void ejemplo () { try{ Resultset rs =getDBTransaction().createStatement(0).executeQuery("sql"); rs.close(); } catch { } }
Como podemos observar cerramos el ResultSet, pero el Statement sigue abierto el cual va dejando cursores abiertos.
En otros casos usamos un try con recursos propios y lo hacemos de la siguiente manera:
public void ejemplo2 () { try (Resultset rs =getDBTransaction().createStatement(0).executeQuery("sql"); ){ (proceso...) } catch { } }
como sabemos el try con recursos propios cierra sus recursos al finalizar el método, pero es necesario que definamos cada recurso por separado, ya que como esta en el ejemplo anterior solo se cierra el ResultSet y el Statement queda abierto.
La forma correcta debería ser:
public void ejemplo3 () { DBTransaction trans = getDBTransaction(); try (Statement = trans.createStatement(0);Resultset rs =st.executeQuery("sql"); ){
(proceso...) } catch { } }
Como podemos observar hemos separado el ResultSet del Statement, ahora el try hará el close de cada uno, el DBTransaction se encarga de cerrarlo el servidor de aplicaciones, en mi caso glassfish.
( psdt: esta es la forma mas actual de realizar autoclose, podemos realizar un close manual usando un finally despues del catch, pero tambien debe ser por separado Statement.close(); ResultSet.close() )
Espero les sea útil y de ayuda.
Slds.
Comentarios
Publicar un comentario