Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle não remove cursores após fechar o conjunto de resultados


O parâmetro init.ora open_cursors define o máximo de cursores abertos que uma sessão pode ter de uma vez. Tem um valor padrão de 50. Se o aplicativo exceder esse número, o erro "ORA-01000:máximo de cursores abertos excedidos" é gerado.

Portanto, é obrigatório fechar os recursos JDBC quando eles não forem mais necessários, em particular java.sql.ResultSet e java.sql.Statement. Se eles não estiverem fechados, o aplicativo terá um vazamento de recursos.

No caso de reutilização do objeto Connection, você deve estar ciente do fato de que os cursores oracle abertos são mantidos abertos e em uso enquanto a conexão existir e a transação não terminou. Quando o aplicativo é confirmado, os cursores abertos são liberados.

Portanto, como designer de aplicativos, você precisa saber uma estimativa aproximada dos cursores abertos necessários para sua transação mais complexa.

A dificuldade está na incapacidade das visualizações de parâmetros internos do oracle (v$open_cursor, v$sesstat, et. al.) de mostrar a diferença entre cursores abertos, que são reutilizáveis ​​e cursores abertos, que ainda estão bloqueados (não reutilizáveis!) um ResultSet ou instrução não fechado. Se você fechar todos os objetos Statement e ResultSet em seu bloco finally, seu aplicativo estará perfeitamente bem.

Ajustar o parâmetro init.ora funciona assim (nossa aplicação precisa de 800 cursores no máximo)
ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;