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é.
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.
voir aussi:
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.