Qual a melhor maneira de fechar Statement e ResultSet???
Em um metodo que retorna um ResultSet, eu posso fechar o Statement e depois executar o return ResulSet, ou o ResultSet precisa do Statement para ser lido?
To com um problema com isso, pois esta estourando a quantidade de cursores suportado pelo BD.
Normalmente o maior problema em relação aos recursos do banco está nos ResultSets, não nos Statements. Você tem certeza de que está chamando o close() para todos os ResultSets que foram abertos? Às vezes esquecemos de um e conforme a aplicação vai rodando o efeito vai acumulando… Se não for isso, talvez a solução seja aumentar o número de cursores no banco mesmo, pois fechar antes ou depois (se for possível) acho que não vai ajudar muito…
Voce sabe como é dificil controlar cada programador, tem sempre alguem que esquece de fechar um ou outro, acontece. Vou rever os codigos e fechar os ResulSet.
Pra voce ter uma idea aumentamos o numero de cursores no banco para 1000, e ja chegou a estourar!
Voce tem certeza que só fechando os resultset [nome.close()] já é o suficiente? Comecei a fechar os Statement tbem!
Segundo a documentacao, um ResultSet eh automaticamente fechado se o Statement usado para criar o ResulSet eh fechado. Da mesma forma, ao fechar uma conexao, todos os recursos relacionados tambem sao liberados.
Se for uma aplicação web, utilize um ConnectionPool, pois se o usuario nao fechar ficar com uma Connection inativa durante um certo tempo, o ConnectionPool (me corrijam se eu tiver errado) resgata a conexão para sí, fechando os ResultSets ativos.
Aonde posso achar documentação sobre o Connection Pool?
A minha aplicação está praticamente pronta, será que é a hora de implementar um Connection Pool? O impacto não será grande?
A Respeito do impacto na aplicação, vc terá que modificar todo lugar onde vc conecta no banco de dados, o resto fica tudo igual. Vamos supor que vc fez uma função genérica para acesso ao banco de dados que retorna um objeto do tipo Connection. A idéia do Connection Pool é a mesma. basta pegar o Connection que o Connection Pool lhe retorna e retornar este objeto para quem solicitou, ou seja, dependendo da maneira que vc fez a aplicação pode ser muito fácil, caso contrário vai dar um pouco mais de trabalho. Uma dica, se vc usou o modelo MVC está praticamente de graça. Se quiser saber um pouco mais sobre MVC dê uma olhada na Struts Framework do Projeto Jakarta. É um excelente começo.
Eu não disse que não precisa fechar os Statements, disse apenas que especificamente no caso de cursores eu tenho a impressão de que ResultSet tem mais impacto. Mas deve ser fechado tudo que não está mais sendo usado.
Eu não confio muito nesse negócio de deixar fechar sozinho, pois normalmente acaba “demorando” demais, e também já tive problemas de estourar limite do banco por causa disso.
Báni, o maior problema do JDBC é que os drivers nem sempre seguem a especificação. É de se esperar que um driver decente feche o ResultSet quando o Statement fechar, mas vai saber…