Duvida com DAO

4 respostas
OliveirakunJava

Olá Pessoal do GUJ,
Estava estudando alguns design patterns e após observar um exemplo de DAO(Data Access Object)utilizando JDBC, que peguei da apostila da Caelum, me surgiu uma dúvida.
Este é um exemplo de DAO:

public class ContatoDAO { 6 7 // a conexão com o banco de dados 8 private Connection connection; 9 10 public ContatoDAO() throws SQLException { 11 this.connection = ConnectionFactory.getConnection(); 12 } 13 14 public void adiciona(Contato contato) throws SQLException { 15 16 // prepared statement para inserção 17 String sql = "insert into contatos (nome,email,endereco) values (?,?,?)"; 18 PreparedStatement stmt = connection.prepareStatement(sql); 19 20 // seta os valores 21 stmt.setString(1,contato.getNome()); 22 stmt.setString(2,contato.getEmail()); 23 stmt.setString(3,contato.getEndereco()); 24 25 // executa 26 stmt.execute(); 27 stmt.close(); 28 } 29 }
Como vcs podem observar, ao criar uma instância desta classe, automaticamente é aberta uma conexão com o banco de dados pois a variável connection recebe um objeto connection da fábrica de conexões(ConnectionFactory). E ao chamar o método adiciona, os valores das variáveis do objeto passado como parâmetro são adicionados ao banco utilizando a conexão aberta anteriormente. Até ai tudo bem, mas neste código a conexão não é fechada e dai vem a pergunta: É normal não fechar a conexão em uma classe DAO? Não seria melhor abrir e fechar a conexão no inicio de cada método DAO(adiciona,remove,consulta,etc…) para evitar problemas de vazamento de memória?
Eu sei que vou ter um melhor desempenho pois posso fazer várias consultas e alterações no banco utilizando a mesma conexão e quando o objeto da classeDAO for recolhido pelo garbage collector a conexão será fechada, por favor me corrijam se eu estiver errado mas mesmo assim não há problemas criar um DAO de acordo com o código acima?
Desde já agradeço a atenção e as respostas de vcs.

4 Respostas

AndreAlves

Boa tarde.

No meu entender, a responsabilidade de abrir e fechar a conexão com o banco de dados não deve estar no DAO.

No seu caso, o ConnectionFactory (ou alguma outra classe) deve ter a missão de abrir e encerrar a conexão, e todos os DAOs da sua aplicação deverão compartilhar estas conexões. Isto é feito para economizar recursos (pois boa parte dos bancos de dados cobram por conexão e/ou tem limitação na quantidade de conexões abertas) e para ganhar performance.

OliveirakunJava

AndreAlves:
Boa tarde.

No meu entender, a responsabilidade de abrir e fechar a conexão com o banco de dados não deve estar no DAO.

No seu caso, o ConnectionFactory (ou alguma outra classe) deve ter a missão de abrir e encerrar a conexão, e todos os DAOs da sua aplicação deverão compartilhar estas conexões. Isto é feito para economizar recursos (pois boa parte dos bancos de dados cobram por conexão e/ou tem limitação na quantidade de conexões abertas) e para ganhar performance.

Então vc acha que seria melhor se eu criasse um método para fechar a conexão após fazer as chamadas ao banco? Na verdade eu ja havia pensado nisso, só estava em dúvida se era a melhor prática.

AndreAlves

no meu trampo a gente usa um ConnectionManager, que abre e fecha as conexões.

OliveirakunJava

Blz, Obrigado!

Criado 21 de abril de 2009
Ultima resposta 21 de abr. de 2009
Respostas 4
Participantes 2