Sobre o funcionamento do Class.forName

5 respostas
L

Olá, estou fazendo uma pagina que faz algumas interações com o banco. Até aí tudo bem, só que comecei a pensar sobre como minha classe que faz acesso ao banco de dados gerencia a conexão.

Basicamente assim que a classe é instanciada eu tento pegar uma conexão, assim:

private boolean conecta() throws Erro {
        if (!conectado) {
            try {
                Class.forName(DRIVER);
                conexao = DriverManager.getConnection(URL, USUARIO, SENHA);
                conectado = true;
                return true;
            } catch (ClassNotFoundException e) {
                throw new Erro(Erro.ERRO_CLASSE_NAO_ENCONTRADA, "Classe: " + DRIVER);
            } catch (SQLException e) {
                throw new ErroSQL(ErroSQL.ERRO_CONECTA, e.getMessage());
            }
        } else {
            return true;
        }        
    }

A parte do Class.forName(DRIVER) é que eu não entendo… Eu não coloco pra ele colocar o retorno dessa função para nenhuma variável, ela simplesmente carrega e pronto? Alguém sabe mais afundo como isso funciona?
No caso, para eu fechar essa conexão que eu criei, eu simplesmente estou setando a variável conexao para NULL, seria isso? Eu sei que existe o método close, mas só de apontar como null, o garbage collector já não destrói a instancia e consequentemente a conexão?

Obrigado desde já.

5 Respostas

caio.ribeiro.pereira

O método estático Class.forName(“String”); permite instanciar em tempo de execução (RunTime) uma classe qualquer, que no caso ele instancia a classe do Driver passado em parâmetro, é um conceito chamado Reflections do Java que também não manjo 100%, mas na teoria ele funciona assim, instancia qualquer classe passada por String ou lança ClassNotFoundException quando uma String não referência uma classe válida, e me corrijam caso esteja errado, mas o método DriverManager.getConnection() pega uma classe instanciada em Runtime e executa sua função com base nos parâmetros URL, USUARIO e SENHA.

Hebert_Coelho

Liberokain:
Olá, estou fazendo uma pagina que faz algumas interações com o banco. Até aí tudo bem, só que comecei a pensar sobre como minha classe que faz acesso ao banco de dados gerencia a conexão.

Basicamente assim que a classe é instanciada eu tento pegar uma conexão, assim:

private boolean conecta() throws Erro {
        if (!conectado) {
            try {
                Class.forName(DRIVER);
                conexao = DriverManager.getConnection(URL, USUARIO, SENHA);
                conectado = true;
                return true;
            } catch (ClassNotFoundException e) {
                throw new Erro(Erro.ERRO_CLASSE_NAO_ENCONTRADA, "Classe: " + DRIVER);
            } catch (SQLException e) {
                throw new ErroSQL(ErroSQL.ERRO_CONECTA, e.getMessage());
            }
        } else {
            return true;
        }        
    }

A parte do Class.forName(DRIVER) é que eu não entendo… Eu não coloco pra ele colocar o retorno dessa função para nenhuma variável, ela simplesmente carrega e pronto? Alguém sabe mais afundo como isso funciona?
No caso, para eu fechar essa conexão que eu criei, eu simplesmente estou setando a variável conexao para NULL, seria isso? Eu sei que existe o método close, mas só de apontar como null, o garbage collector já não destrói a instancia e consequentemente a conexão?

Obrigado desde já.

Mais a fundo não sei. Sei que com ela você irá registrar no seu programa essa classe que se encontra no JAR e você será feliz.

Não passe sua conexão para null, mas sim utilize o método commit(); e depois close.

L

Obg pelas respostas, nessa de “não use null, use commit e depois close”, se desse algum erro e conexão não fechasse, existe algum modo de saber quantas conexões estão abertas no banco?

caio.ribeiro.pereira

Uma boa prática muito utilizada com JDBC é fazer para cada método com o banco de dados igual ao exemplo abaixo…

public class ClienteDAO {

     private Connection con = new ConnectionFactory().getConnection();

     public void salvar(Cliente cliente){
              String sql = "insert into cliente (nome,email,endereco) values (?,?,?)";
              PreparedStatement stmt = con.prepareStatement(sql);
              stmt.setString(1, "Josivaldo Mesquita Alvares da Silva Sauro Mendonça Leite Melo Gonçalvez Tolentino Junior");
              stmt.setString(2, "[email removido]");
              stmt.setString(3, "Rua Dalvo Trombeta, 667");
              stmt.execute();
              // Fecha conexão de execução de queries
              stmt.close();              
              // Verifica se há conexões abertas
              if(con.isClosed != true){
                     con.close();
              }
       }
}

Para obter outras melhores práticas com JDBC de uma olhada na apostila FJ21 da caelum: http://www.caelum.com.br/download/caelum-java-web-fj21.pdf

L

Obrigado… Vou checar esse endereço.

Criado 22 de novembro de 2011
Ultima resposta 22 de nov. de 2011
Respostas 5
Participantes 3