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.
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.
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:)