所以我已经弄清楚了我的错误,现在我只是在寻找一些关于究竟发生了什么的见解。我正在使用Apache Tomcat版本7.0.32。我正在使用this tutorial为JDBC设置池。在我的META-INF文件夹中,我创建了一个context.xml文件并将其放在那里。
<?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>
我写这个
时遇到了这个错误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
只有在context.xml文件中包含此语句时才会出现此错误。当我删除它没有错误。
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
我想确保拥有它的原因是因为在apache tomcat教程中它说
factory is required, and the value should be org.apache.tomcat.jdbc.pool.DataSourceFactory
然后我对SO进行了一些研究,并发现一篇帖子说如果你有一个旧版本的tomcat,你需要在你的lib文件夹中添加this jar。所以我添加了jar,现在它可以正常工作,但是我希望得到一些关于到底是什么的信息因为我使用的是最新的tomcat版本。那么为什么当我指定工厂时我会收到错误。我正在添加什么是这个jar,为什么关于它的文档很少?任何关于这里发生的事情的信息将不胜感激。
答案 0 :(得分:60)
JDBC驱动程序必须对与数据源工厂本身相同的类加载器可见。数据源工厂库放在Tomcat自己的/lib
文件夹中,因此由Tomcat&#34; common&#34;类加载器。
您的问题听起来很像您在网络应用程序/WEB-INF/lib
中删除了JDBC驱动程序。网络应用程序/WEB-INF/lib
对于&#34;常见&#34;是不可见的。类加载器。因此,从技术上讲,您必须将JDBC驱动程序放在Tomcat自己的/lib
文件夹中(或者,至少在common.loader
中的/conf/catalina.properties
设置指定的可配置路径中)为了使它对数据源工厂可见。
或者,在您尝试将数据源工厂复制到/WEB-INF/lib
时也会修复它。 webapp的/WEB-INF/lib
在类加载方面具有比Tomcat的/lib
文件夹更高的优先级。因此,如果在/WEB-INF/lib
中找到数据源工厂,则会从那里加载它。正如JDBC驱动程序也在那里,它将被看到。然而,这不是解决具体问题的正确方法,这是一种解决方法,因此您不应该这样做。
没有专门针对此问题的文档。然而,Tomcat Class Loader HOW-TO将有助于理解Tomcat中的类加载层次结构。
答案 1 :(得分:0)
我遇到了同样的问题,你的解决方案对我不起作用。 我必须将'mysql-connector-java-5.1.30-bin.jar'文件添加到我的lib文件夹才能使用,因为我正在使用该驱动程序:) 欢呼声。