Où dois-je placer le pilote JDBC pour Tomcat du pool de connexion?
Donc j'ai compris mon erreur, maintenant je suis à la recherche d'un aperçu de ce qui se passe exactement. Je suis à l'aide d'Apache Tomcat Version 7.0.32. Je suis à l'aide de ce tutoriel pour configurer la mise en commun pour JDBC. Dans mon répertoire META-INF, j'ai fait un context.xml fichier 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 ce
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 vient que j'ai relevé dans mon context.xml fichier. Lorsque je le supprime aucun message d'erreur.
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
La raison pour laquelle je veux m'assurer que j'ai c'est que dans les apache tomcat tutoriel il dit
factory is required, and the value should be org.apache.tomcat.jdbc.pool.DataSourceFactory
Alors j'ai fait un peu de recherche sur DONC et trouvé un post en disant que vous avez besoin pour ajouter ce pot à votre dossier lib si vous avez une ancienne version de tomcat. J'ai donc ajouté le pot et maintenant, il fonctionne, mais je voudrais avoir quelques renseignements sur ce qui sur terre est en cours parce que je suis à l'aide de la dernière version de tomcat. Alors pourquoi quand je spécifier une usine puis-je obtenir une erreur. Et qu'est-ce que ce pot que je vais ajouter dans et pourquoi est-il très peu de documentation à ce sujet? Aucune information sur ce qui se passe ici serait grandement apprécié.
Vous devez vous connecter pour publier un commentaire.
Le pilote JDBC doit être visible pour le même chargeur de classe comme source de données de l'usine elle-même. La source de données de l'usine de la bibliothèque est placé dans de Tomcat propre
/lib
le dossier et donc chargé par Tomcat, "commune" classloader.Votre problème sonne beaucoup comme que vous avez supprimé le pilote JDBC dans webapp est
/WEB-INF/lib
. La webapp est/WEB-INF/lib
est invisible à la "commune" de chargeur de classe. Donc, techniquement, vous devez placer le pilote JDBC dans de Tomcat propre/lib
dossier (ou, au moins, dans un configurable chemin d'accès spécifié parcommon.loader
paramètre dans/conf/catalina.properties
) afin de le rendre visible à la source de données d'usine.Ou, comme vous l'avez tenté de copier la source de données d'usine en
/WEB-INF/lib
seront également fixer. La webapp est/WEB-INF/lib
a, à savoir une plus grande priorité dans classloading que Tomcat/lib
dossier. Donc, si la source de données de l'usine est trouvé dans/WEB-INF/lib
, il sera chargé à partir de là. Comme le pilote JDBC est également là, on le verra. Toutefois, ce n'est pas la bonne solution à votre problème concret, ce n'est plus une solution de contournement, de sorte que vous ne devriez pas faire cela.Il n'y a pas exactement de la documentation qui vise spécifiquement à cette question. Le Tomcat Chargeur de Classe COMMENT va cependant aider à la compréhension de la classe de chargement de la hiérarchie dans Tomcat.
Voir aussi:
C:\path\to\apache-tomcat-7.0.30
. Ce n'est pas pour être gérés à partir de l'intérieur de l'Éclipse. Le/conf
dossier mentionné dans ma réponse est aussi dans la.tomcat-jdbc.jar
fichier. L'usine de la valeur est le nom de classe entièrement qualifié qui est passée àClass#forName()
dans Tomcat, code interne de sorte qu'il pourrait être chargé et instancié. Oui, le fichier JAR du pilote JDBC doit être conservé dans de Tomcat/lib
(ou au moins dans un chemin d'accès spécifié parcommon.loader
de la propriété).context.xml
fichier(s), il trouve des ressources de typejavax.sql.DataSource
avec unfactory
attribut. Il fait unDataSourceFactory factory = (DataSourceFactory) Class.forName(factoryClassName).newInstance();
et puisDataSource dataSource = factory.createDataSource(properties);
avec toutes les autres propriétés trouvé dans le fichier XML pour obtenir enfin le bétonDataSource
instance qui a ungetConnection()
méthode. Le fichier JAR n'est pas entièrement chargé, il est tout simplement "déjà" dans le classpath, de sorte que l'usine de la classe peut être trouvé.DataSourceFactory
. Par la voie, les pilotes JDBC de travail à peu près de la même façon.J'ai eu le même problème, votre solution ne fonctionne pas pour moi.
J'ai dû ajouter de la 'mysql-connector-java-5.1.30-bin.jar fichier de mon dossier lib pour que cela fonctionne, puisque j'ai été l'aide de ce pilote 🙂
Des acclamations.