web-dev-qa-db-fra.com

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

Donc, j'ai compris mon erreur, maintenant je cherche juste un aperçu de 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 l'ai mis dedans.

<?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 ça

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 survient que lorsque j'ai cette déclaration dans mon fichier context.xml. Quand je l'enlève pas d'erreur. 

factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory" 

La raison pour laquelle je veux être sûr de l'avoir est parce que dans le tutoriel Apache Tomcat, il est dit

factory is required, and the value should be org.Apache.Tomcat.jdbc.pool.DataSourceFactory

Alors, j’ai fait un peu de recherche sur SO et trouvé un message disant que vous devez ajouter ce fichier jar à votre dossier lib si vous avez une version plus ancienne de Tomcat. J'ai donc ajouté le bocal et maintenant cela fonctionne, mais j'aimerais avoir quelques informations sur ce qui se passe, car j'utilise la version la plus récente de Tomcat. Alors pourquoi, quand je spécifie une usine, est-ce que je reçois une erreur? Et quel est ce pot que j'ajoute et pourquoi y a-t-il très peu de documentation à ce sujet? Toute information sur ce qui se passe ici serait grandement appréciée.

25
gmustudent

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

Votre problème ressemble beaucoup à celui que vous avez laissé le pilote JDBC dans /WEB-INF/lib de webapp. /WEB-INF/lib de l'application Web est invisible pour le chargeur de classe "commun". Donc techniquement, vous devez placer le pilote JDBC dans le dossier /lib de Tomcat (ou au moins dans un chemin configurable spécifié par le paramètre common.loader dans /conf/catalina.properties) afin de le rendre visible par la fabrique de sources de données.

Ou, comme vous l'avez tenté, copier la fabrique de source de données dans /WEB-INF/lib résoudra également le problème. /WEB-INF/lib de la webapp a une priorité plus élevée dans le chargement de classes que le dossier /lib de Tomcat. Donc, si la fabrique de source de données est trouvée dans /WEB-INF/lib, elle sera chargée à partir de là. Comme le pilote JDBC est également là, on le verra. Ce n'est cependant pas la bonne solution à votre problème concret, c'est plutôt une solution de contournement, vous ne devriez donc pas le faire.

Il n’existe pas exactement de documentation spécifiquement consacrée à ce problème. Le Tomcat Class Loader HOW-TO vous aidera toutefois à comprendre la hiérarchie de chargement de classe dans Tomcat.

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

Voir également:

58
BalusC

J'ai eu le même problème, votre solution ne fonctionnait pas pour moi . Je devais ajouter le fichier 'mysql-connector-Java-5.1.30-bin.jar' dans mon dossier lib pour que cela fonctionne. utilisait ce pilote:)

0
Vasile Surdu