Olá pessoal
Comecei a desenvolver minhas classes DAO para meu trabalho de conclusão de curso e estou tendo um problema. Na verdade eu já consegui resolver o problema fazendo "gambiarra", porém esta não é a melhor solução. Por este motivo gostaria da ajuda de vocês.
O problema é: Quando executo um método DAO, por exemplo um select(), a conexão que pertence a classe é fechada ao mesmo tempo que fecho somente a conexão do método. Porque? Não consegui entender o porque. Fiz duas variáveis do tipo Connection na minha classe UsuarioDaoImp justamente para a variável global permanecer ativa enquanto estiver trabalhando com objeto, e somente fechar as variávies locais do tipo Connection.
Fiz um código exemplo que segue os mesmos esquemas da minha classe: Veja
Classe Usuario
public class Usuario {
private int id;
private String usuario;
private String senha;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the usuario
*/
public String getUsuario() {
return usuario;
}
/**
* @param usuario the usuario to set
*/
public void setUsuario(String usuario) {
this.usuario = usuario;
}
/**
* @return the senha
*/
public String getSenha() {
return senha;
}
/**
* @param senha the senha to set
*/
public void setSenha(String senha) {
this.senha = senha;
}
}
Interface UsuarioDao
public interface UsuarioDao {
Usuario select(int cod) throws Exception;
}
Classe UsuarioDaoImp
import br.com.persistencia.dao.conect.Conectar;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @author Leandro
*/
public class UsuarioDaoImp implements UsuarioDao {
Connection conn = null; // -> Esta conexão é fechada no mesmo momento
// -> que eu fecho a conexão do método
public UsuarioDaoImp() throws Exception{
conn = new Conectar(
"com.mysql.jdbc.Driver",
"jdbc:mysql://localhost/livraria?user=root&password=").getConector();
}
public Usuario select(int cod) throws Exception{
Usuario usu = null;
PreparedStatement ps = null;
Connection conn = null;
ResultSet rs = null;
try{
conn = this.conn;
ps = conn.prepareStatement("SELECT usuario, senha FROM usuarios where id=?");
ps.setInt(1, cod);
rs = ps.executeQuery();
usu = new Usuario();
while(rs.next()){
usu.setSenha(rs.getString(1));
usu.setUsuario(rs.getString(2));
}
ps.close();
rs.close();
}catch (SQLException ex){
throw new SQLException(ex);
}catch (Exception ex){
throw new Exception(ex);
}finally{
conn.close(); // --> A intenção aqui é somente
// fechar conexão do método e não o da classe
}
return usu;
}
}
Fiz duas chamas do método select da classe UsuarioDaoImp
Usuario us = usu.select(1);
System.out.println("usuário: "+us.getUsuario());
System.out.println("Senha: "+us.getSenha());
Usuario US = usu.select(2);
System.out.println("usuário: "+US.getUsuario());
System.out.println("Senha: "+US.getSenha());
E recebi as seguintes repostas
usuário: teste1 Senha: teste1 java.sql.SQLException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. at pkTeste.UsuarioDaoImp.select(UsuarioDaoImp.java:53) at pkTeste.TestadorDeMetodos.main(TestadorDeMetodos.java:54) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.Util.getInstance(Util.java:381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1098) at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4076) at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4042) at pkTeste.UsuarioDaoImp.select(UsuarioDaoImp.java:38) ... 1 more
Porque será que a conexão da variável de escopo global conn (Connection) é fechada no momento que é fechada a conexão da viarável com o mesmo nome só que de escopo local?
Obrigado
[]