Encontrei um tópico onde tinha uma dúvida parecida com esta que tenho, mas não conseguiu resolver. --> [url]http://www.guj.com.br/posts/list/57125.java[/url]
De acordo com os exemplos que vejo e as dicas do meu professor são que sempre que uma instrução (select, update...) for executada, via JDBC, a conexão tem que ser fechada sempre (dentro do método).
O resultSet e o PreparedStatement eu sempre fecho, mas o Connection costumo fechar somente quando não preciso mais do objeto do tipo UsuarioDaoImp (neste caso). Contumava fazer isso quando era aplicação desktop usando swing, mas com aplicação web usando JSF eu não sei.
Info: O banco de dados que uso é MySQL.
Veja:public class UsuarioDaoImp implements UsuarioDao {
private Connection conn = null;
public UsuarioDaoImp() throws Exception{
conn = new Conectar(
"com.mysql.jdbc.Driver",
"jdbc:mysql://localhost/livraria?user=root&password=").getConector();
}
public int insert(Usuario usu) throws Exception{
int number;
PreparedStatement ps = null;
Connection conn = null;
if(usu == null){
throw new Exception("O valor passado não pode ser nulo");
}
try{
String sql = "INSERT INTO aluno " +
"(id, usuario, senha) " +
"VALUES (?,?,?)";
conn = this.conn;
ps = conn.prepareStatement(sql);
ps.setInt(1, usu.getId());
ps.setString(2, usu.getUsuario());
ps.setString(3, usu.getSenha());
number = ps.executeUpdate();
ps.close();
}catch(SQLException ex){
throw new SQLException(ex);
}catch (Exception ex){
throw new Exception(ex);
}finally{
conn.close(); // --> Sempre tenho que fechar a conexão aqui? é uma boa prática?
//Fiz uns testes e verifiquei que sempre que fecho esta conexão o objeto de escopo global conn também é fechado de forma automática.
}
return number;
}
Minha aplicação web pode ficar mais lenta se a cada instrução (select, update...) que for feita equivaler a uma chamada do método getConnection(), certo? A saída que tive foi não fechar a conexão dentro da classe, mas acho que quando a página web é fechada, a conexão deve ficar aberta ou perdida porque eu não a fechei. Correto?
Como poderia resolver este problema?
Obrigado