Como fazer para fechar o Connection, Statement e ResultSet [RESOLVIDO]

Fiz da seguinte maneira:

Criei uma classe Conexão que possui 3 Métodos

CriaConexao() que retorna um Conection;
CriaSTMT() que utiliza o método CriaConexao e retorna um Statement;
getResultSet que usa o método CriaSTMT e retorna um ResultSet;

Bele… Mas ai fica a duvida… Por cada um esta numa classe separada… Como eu fecho eles? Ou na hora que parar de usar o Método do sistema que esta chamando essas conexões ela é fechada sozinha???

Cada vez que chamo esses métodos é criado um novo pool de conexão??? Ou to falando besteira?

É, bastante besteira! Acho que vc não precisa segmentar tanto assim as funcionalidades e sobre spool de conexão vc tem que implementar ou seja não é porque vc criou uma conexão que vc ja tem um poll. Vc ja leu os artigos sobre JDBC ou uso de banco de dados que estão na area “artigos” aqui no site ? Leia e obtenha mais detalhes sobre tudo isso que vc quer fazer.

Sim ja li… 2 vezes Ai que confundi tudo o.O
Inclusive to estudando o hibernate e o lance de tirar o sql do código usando PrepareStatement.

Fiz essa zona ai que de onde eu tiver eu apenas chamo um

ResultSet rs = new CriarConexão().getResultSet(“Select * tabela”);

E ta feito a consulta.

Nenhum desses objetos (ResultSet, Connection e Statement) é “fechado sozinho” quando a rotina deixa de usá-los.

É melhor sempre fechá-los imediatamente depois do uso (no caso da conexão, talvez você a mantenha aberta o tempo todo, não sei como você estruturou seu programa). Use um “finally” para forçar que os objetos sejam fechados, mesmo que haja alguma exceção no uso que você não conseguiu tratar.

O “garbage collector” até tenta fechar esses objetos, chamando o método “finalize”, mas você não deve confiar nesse comportamento, porque ele é só chamado muito de vez em quando - na verdade, acredito que na segunda passagem do “garbage collection completo” (“full garbage collection”) é que isso ocorre. Ou seja, é uma coisa que pode ficar várias horas com um ResultSet ou Connection ou Statement aberto, se a aplicação não estiver muito sobrecarregada de memória - não é uma boa coisa.

Cuidado com professores que dizem “o garbage collector vai fechar isso para você, não se preocupe”.

Em uma aplicação no mundo real, você não pode depender desse comportamento, que não é documentado e só existe justamente para “quebrar o galho” de programas que tiveram algum problema no tratamento de erros.

[quote=entanglement]Nenhum desses objetos (ResultSet, Connection e Statement) é “fechado sozinho” quando a rotina deixa de usá-los.

É melhor sempre fechá-los imediatamente depois do uso (no caso da conexão, talvez você a mantenha aberta o tempo todo, não sei como você estruturou seu programa). Use um “finally” para forçar que os objetos sejam fechados, mesmo que haja alguma exceção no uso que você não conseguiu tratar.

O “garbage collector” até tenta fechar esses objetos, chamando o método “finalize”, mas você não deve confiar nesse comportamento, porque ele é só chamado muito de vez em quando - na verdade, acredito que na segunda passagem do “garbage collection completo” (“full garbage collection”) é que isso ocorre. Ou seja, é uma coisa que pode ficar várias horas com um ResultSet ou Connection ou Statement aberto, se a aplicação não estiver muito sobrecarregada de memória - não é uma boa coisa.

Cuidado com professores que dizem “o garbage collector vai fechar isso para você, não se preocupe”.

Em uma aplicação no mundo real, você não pode depender desse comportamento, que não é documentado e só existe justamente para “quebrar o galho” de programas que tiveram algum problema no tratamento de erros. [/quote]

Grande MESTRE =D

Exatamente o que eu precisava saber. Minha aplicação é a seguinte, tenho X dispositivos que usam para atualizar seus DB locais algumas vezes por dia. Então estou enviando os dados pesquisados no Banco em um XML que o dispositivo (os iPAd) deserializa e grava no DB local.

Mas olha só o que fala na documentação oficial:

[quote]Statement objects will be closed automatically by the Java garbage collector. Nevertheless, it is recommended as good programming practice that they be closed explicitly when they are no longer needed. This frees DBMS resources immediately and helps avoid potential memory problems.

— Traduzindo
Objetos Statement será fechada automaticamente pelo coletor de lixo Java. No entanto, é recomendado como boa prática de programação que ser fechada explicitamente quando eles não são mais necessários. Isso libera os recursos imediatamente DBMS e ajuda a evitar possíveis problemas de memória.[/quote]

Ou seja… o garbage era pra limpar mas não garantimos nada kkk

Em 5.1.5
http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/statement.html