sql >> Base de Datos >  >> RDS >> Mysql

¿Cuándo se necesita Class.forName al conectarse a una base de datos a través de JDBC en una aplicación web?

Los controladores JDBC4 incluyen un archivo:

META-INF/services/java.sql.Driver

en el jar que utiliza el mecanismo ServiceProvider para registrar la implementación del controlador con la JVM (consulte javadocs para java.util.ServiceLoader ). Por eso Class.forName ya no es necesario.

Mi conjetura es que este es un problema del cargador de clases. El ServiceLoader javadoc menciona que:

Intentaría poner su controlador en tomcat\lib directorio en lugar del directorio de su aplicación web para ver si eso marca la diferencia (¿cargador de clases diferente?).

Si inicia su aplicación web a través de un ide y establece un punto de interrupción, una vez que llegue al punto de interrupción, puede usar la función "evaluar expresión" para ejecutar:ServiceLoader.load(Driver.class) . Esto le dará un ServiceLoader clase en la que puede echar un vistazo para ver qué controladores están registrados. Puede verificar si el controlador mysql está allí, en qué parte de la lista está, etc., lo que podría ayudar a descubrir el comportamiento aquí.