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

Fechando ResultSet mas não fechando PreparedStatement


O vazamento será o problema máximo de cursor aberto.
ORA-01000: maximum open cursors exceeded

Se o máximo de cursores abertos for excedido, o banco de dados ficará inutilizável, exceto para os cursores que já estão retidos. No entanto, na maioria das vezes, quando isso acontece, os cursores mantidos nem são usados ​​(o que seria o caso da sua pergunta).

Desde o java 7, a melhor maneira de lidar com isso é usar uma tentar com recursos . Ambos ResultSet e PreparedStatement implementa AutoCloseable interface, o que significa que eles serão fechados quando não forem mais necessários.

Se você não tem java 7, então você precisa lidar com isso no finally block, mas certifique-se de verificar os valores nulos antes de fechar, caso contrário você poderá encontrar um NPE se o recurso nunca tiver sido inicializado.

Observe que o inverso não causará nenhum problema, pois fechar uma instrução fechará automaticamente o conjunto de resultados.

Observe que você pode facilmente permitir mais cursores em seu aplicativo para menos chance de exceder o máximo.
ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;

No entanto, na maioria das vezes, se você encontrar o máximo de cursores abertos, isso não deve ser uma solução, pois apenas ocultaria o problema real.