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!
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. [=
rafadelnero1 like
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.