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.