web-dev-qa-db-fra.com

Pourquoi le pilote JDBC doit-il être placé dans le dossier Tomcat_HOME / lib?

J'ai un problème étrange où deux applications Web avec le pilote Oracle JDBC entreront en conflit. Je dois mettre le JAR du pilote JDBC dans le dossier commun Tomcat_HOME/lib. Quelle est la raison pour ça?

40
zjffdu

Les pilotes JDBC s'enregistrent dans le singleton JVM à l'échelle DriverManager qui est partagé par toutes les applications Web. Si vous avez le même (comme dans le nom de classe), le pilote JDBC s'enregistre deux fois à partir de deux applications Web différentes, cela peut provoquer votre problème. Cela est encore plus problématique si vos applications Web utilisent différentes versions du même pilote JDBC.

De plus, le fait de placer des pilotes JDBC dans le dossier lib de Tomcat aidera à éviter les fuites de mémoire lorsque vous redéployez votre application Web sans redémarrer Tomcat, par exemple si vous venez de mettre un nouveau fichier WAR dans le dossier webapps de Tomcat:

La classe DriverManager est chargée par le bootstrap classloader et ainsi "vit" globalement dans la JVM, tandis que Tomcat charge toutes les applications Web dans leurs propres classloaders. Donc, si un pilote JDBC de le dossier WEB-INF/lib d'une application Web s'enregistre dans DriverManager, il épingle le chargeur de classe de cette application Web en mémoire (et donc toutes les classes de cette application Web), empêchant sa collecte de place.

Si, à la place, les pilotes DriverManager et JDBC proviennent de chargeurs de classe d'applications non Web, vous pouvez librement redéployer vos applications Web sans qu'aucune classe d'application Web ne s'épingle dans des classes chargées à partir d'autres chargeurs de classe.

Les versions actuelles de Tomcat (probablement 6.x et certainement 7.x) enregistreront des avertissements sur le déploiement d'une application Web si une fuite de mémoire est détectée, entre autres par les pilotes JDBC.

78
Philipp Reichart