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

donc j'ai compris mon erreur, maintenant je cherche juste un aperçu de ce qui se passe exactement. J'utilise la version 7.0.32 D'Apache Tomcat. J'utilise ce tutoriel pour configurer pooling pour JDBC. Dans mon dossier META-INF j'ai créé un contexte.fichier xml et de mettre cela en.

<?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.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 vient que j'ai énoncé dans mon contexte.XML fichier. Lorsque je le supprime aucun message d'erreur.

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

la raison pour laquelle je veux être sûr de l'avoir est que dans le tutoriel apache tomcat il est écrit

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 j'ai trouvé un message disant que vous devez ajouter ce pot à votre dossier lib si vous avez une version plus ancienne de tomcat. Donc j'ai ajouté le pot et maintenant ça marche mais je voudrais avoir quelques informations sur ce qu'est sur terre je continue parce que j'utilise la nouvelle version de tomcat. Alors pourquoi quand je spécifie une usine je reçois une erreur. Et qu'est-ce que cette Jarre que j'ajoute Et pourquoi y a-t-il très peu de documentation à ce sujet? Aucune information sur ce qui se passe ici serait grandement apprécié.

25
demandé sur BalusC 2012-10-31 19:46:44

2 réponses

le pilote JDBC doit être visible par le même classloader que l'usine source de données elle-même. La bibliothèque source de données factory est placée dans le propre dossier /lib de Tomcat et donc chargée par le classloader "common" de Tomcat.

votre problème ressemble beaucoup à ce que vous avez laissé tomber le pilote JDBC dans /WEB-INF/lib de webapp . Le webapp /WEB-INF/lib est invisible pour le classloader" commun". Donc techniquement, vous devez placer le pilote JDBC dans le propre Tomcat /lib dossier (ou, au moins, dans un chemin configurable comme spécifié par common.loader paramètre dans /conf/catalina.properties ) afin de le rendre visible à l'usine de la source de données.

Ou, comme vous l'avez tenté de copier la source de données d'usine en /WEB-INF/lib seront également fixer. Le webapp /WEB-INF/lib a notamment une priorité plus élevée dans le chargement de classe que le dossier /lib de Tomcat. Donc si l'usine de la source de données se trouve dans /WEB-INF/lib , elle sera chargée à partir de là. En tant que JDBC le pilote est également là, on le verra. Ce n'est toutefois pas la bonne solution à votre problème concret, il s'agit plutôt d'une solution de contournement, donc vous ne devriez pas faire cela.

il n'y a pas exactement de documentation qui est spécifiquement ciblée sur cette question. Le Tomcat Class Loader HOW-TO aidera cependant à 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 aussi:

57
répondu BalusC 2017-05-23 11:55:03

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

0
répondu Vasile Surdu 2014-05-08 18:56:24