28 votes

Où dois-je placer le pilote JDBC pour le pool de connexion de Tomcat ?

J'ai donc trouvé mon erreur, maintenant je cherche juste à savoir ce qui se passe exactement. J'utilise Apache Tomcat version 7.0.32. J'utilise ce tutoriel pour configurer le pooling pour JDBC. Dans mon dossier META-INF, j'ai créé un fichier context.xml et j'y ai mis ceci.

<?xml version="1.0" encoding="UTF-8"?>

<Context>
    <Resource type="javax.sql.DataSource" name="jdbc/gmustudent"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/official"
        username="root" password="root"
        maxActive="100" maxIdle="20" minIdle="15" initialSize="15" maxWait="10000" />
</Context>

J'ai eu cette erreur quand j'ai écrit ceci

WARNING: Unexpected exception resolving reference
java.sql.SQLException: com.mysql.jdbc.Driver
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:631)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:485)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:143)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103)
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:539)
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:237)
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:143)
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1061)
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:671)
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:270)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246)
    ... 29 more
Oct 31, 2012 11:23:25 AM org.apache.catalina.core.NamingContextListener addResource
WARNING: Failed to register in JMX: javax.naming.NamingException: com.mysql.jdbc.Driver
Oct 31, 2012 11:23:25 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8086"]
Oct 31, 2012 11:23:25 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Oct 31, 2012 11:23:25 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 794 ms

Cette erreur ne se produit que lorsque cette déclaration figure dans mon fichier context.xml. Lorsque je la supprime, il n'y a pas d'erreur.

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 

La raison pour laquelle je veux m'assurer que je l'ai, c'est que dans le tutoriel d'Apache Tomcat, il est dit que

factory is required, and the value should be org.apache.tomcat.jdbc.pool.DataSourceFactory

Alors j'ai fait quelques recherches sur SO et j'ai trouvé un article disant qu'il faut ajouter cette jarre dans votre dossier lib si vous avez une ancienne version de tomcat. J'ai donc ajouté le jar et maintenant cela fonctionne mais j'aimerais avoir des informations sur ce qui se passe car j'utilise la dernière version de tomcat. Alors pourquoi lorsque je spécifie une usine, j'obtiens une erreur. Et quel est ce bocal que j'ajoute et pourquoi y a-t-il très peu de documentation à son sujet ? Toute information sur ce qui se passe ici serait grandement appréciée.

63voto

BalusC Points 498232

Le pilote JDBC doit être visible par le même classloader que la fabrique de la source de données elle-même. La bibliothèque de la fabrique de la source de données est placée dans le propre fichier /lib et donc chargé par le chargeur de classe "commun" de Tomcat.

Votre problème ressemble beaucoup au fait que vous avez déposé le pilote JDBC dans le dossier de la webapp. /WEB-INF/lib . L'application web /WEB-INF/lib est invisible pour le chargeur de classe "commun". Donc, techniquement, vous devez placer le pilote JDBC dans la propre classe de Tomcat. /lib (ou, au moins, dans un chemin d'accès configurable, comme spécifié par l'option common.loader à l'intérieur /conf/catalina.properties ) afin de le rendre visible à la fabrique de la source de données.

Ou, comme vous l'avez tenté, en copiant l'usine de la source de données dans /WEB-INF/lib le réparera également. L'application web /WEB-INF/lib a notamment une priorité plus élevée dans le chargement des classes que la classe /lib dossier. Donc si l'usine de la source de données se trouve dans /WEB-INF/lib il sera chargé à partir de là. Comme le pilote JDBC est également présent, il sera vu. Ce n'est cependant pas la bonne solution à votre problème concret, il s'agit plutôt d'une solution de contournement, vous ne devriez donc pas le faire.

Il n'existe pas vraiment de documentation spécifique à cette question. Le site Chargeur de classe Tomcat HOW-TO aidera cependant à comprendre la hiérarchie de chargement des classes dans Tomcat.

screen shot showing Tomcat folder with nested "lib" folder with nested JDBC driver .jar file

Voir aussi :

0voto

Vasile Surdu Points 409

J'ai eu le même problème, votre solution n'a pas fonctionné pour moi. J'ai dû ajouter le fichier 'mysql-connector-java-5.1.30-bin.jar' à mon dossier lib pour que cela fonctionne, puisque j'utilisais ce pilote :) Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X