Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quand Class.forName est-il nécessaire lors de la connexion à une base de données via JDBC dans une application Web ?

Les pilotes JDBC4 incluent un fichier :

META-INF/services/java.sql.Driver

dans le jar qui utilise le mécanisme ServiceProvider pour enregistrer l'implémentation du pilote avec la JVM (voir javadocs pour java.util.ServiceLoader ). C'est pourquoi Class.forName n'est plus nécessaire.

Je suppose qu'il s'agit d'un problème de chargeur de classe. Le ServiceLoader javadoc mentionne que :

J'essaierais de mettre votre pilote dans le tomcat\lib plutôt que votre répertoire d'application Web pour voir si cela fait une différence (chargeur de classe différent ?).

Si vous lancez votre application Web via un ide et définissez un point d'arrêt, une fois que vous avez atteint le point d'arrêt, vous pouvez utiliser la fonctionnalité "évaluer l'expression" pour exécuter :ServiceLoader.load(Driver.class) . Cela vous donnera un ServiceLoader classe dans laquelle vous pouvez jeter un coup d'œil pour voir quels pilotes sont enregistrés. Vous pouvez vérifier si le pilote mysql est là, où il se trouve dans la liste, etc., ce qui pourrait aider à comprendre le comportement ici.