Curiosidade sobre o Class.forName()

13 respostas
rafadelnero

Boa noite!

Estou com uma dúvida referente ao uso do Class.forName(), em diversos lugares eu leio que não é preciso mais utilizá-lo em versões do java 6 ou 7, porém quando não uso, ocorre erro informando que não há driver carregado, e quando uso Class.forName() o código funciona perfeitamente, gostaria de saber o porque disso!

Obrigado!

13 Respostas

drsmachado

Pode ser que o driver que você está utilizando não está preparado para isto.

rafadelnero

Pode ser, mas o estranho é que estou usando a uma das últimas versões, mysql-connector-java-5.1.22.

rodrigo.uchoa

O Class.forName("") é dispensável se o seu driver tiver sido implementado como uma SPI. Para descobrir isso é fácil, expande o arquivo .jar do driver e da uma olhada se dentro do diretório META-INF tem um diretório chamado “services”. Se tiver provavelmente é SPI sim.

Obs: Esses drivers são chamados de “type 4” ou “jdbc 4”. As vezes tem até esse termo no nome do arquivo. O driver do PostgreSQL por exemplo: postgresql-9.0-801.jdbc4.jar

rafadelnero

rodrigo.uchoa:
O Class.forName("") é dispensável se o seu driver tiver sido implementado como uma SPI. Para descobrir isso é fácil, expande o arquivo .jar do driver e da uma olhada se dentro do diretório META-INF tem um diretório chamado “services”. Se tiver provavelmente é SPI sim.

Obs: Esses drivers são chamados de “type 4” ou “jdbc 4”. As vezes tem até esse termo no nome do arquivo. O driver do PostgreSQL por exemplo: postgresql-9.0-801.jdbc4.jar

Acabei de verificar, o arquivo services existe sim e está escrito com.mysql.jdbc.Driver. Mesmo assim se eu não declarar Class.forName(), ocorre o erro informando que o driver não está carregado.

rodrigo.uchoa

Estranho. Tem certeza que esse é o único driver no seu classpath? Pra tirar a prova dos 9, é só debuggando o código do driver mesmo para ter certeza do que ta acontecendo.

rafadelnero

Sim, certeza, apenas o driver mysql-connector-java-5.1.22-bin.jar, vou debugar pra ver.

rafadelnero

Debuguei aqui e descobri uma coisa estranha, testando diretamente a conexão no Java puro com o método main() eu não preciso carregar o Driver, mas se eu for usar a conexão em uma página JSP, o erro ocorre, eu sei que não é boa prática mas estou apenas fazendo alguns testes.

rodrigo.uchoa

Cuidado que a forma de colocar o driver no classpath quando você está usando um programa standalone simples e quando você está em um ambiente web pode ser bem diferente.

rafadelnero

Coloquei a o arquivo jar diretamente na pasta lib da pasta WEB-INF e adicionei ao build path.

rodrigo.uchoa

Confirma se já não existe alguma outra versão desse driver no classpath do próprio servidor. Tomcat, JBoss, ou seja qual for.

rafadelnero

Estou usando Tomcat 7 e pelo que vi não tem.

Hebert_Coelho

Tente colocar a lib dentro da pasta lib do tomcat. [=

rafadelnero

Hahaha, não funcionou Hebert! Descobri que o erro só ocorre em páginas JSP, em Servlets eu não preciso usar Class.forName pra carregar o driver, sei que é má prática e quebra totalmente o modelo MVC, mas é só para fins de testes.

Criado 18 de março de 2014
Ultima resposta 21 de mar. de 2014
Respostas 13
Participantes 4