我在哪里为Tomcat的连接池放置JDBC驱动程序?

所以我已经弄清楚了我的错误,现在我只是在寻找一些关于究竟发生了什么的见解。 我正在使用Apache Tomcat版本7.0.32。 我正在使用本教程为JDBC设置池。 在我的META-INF文件夹中,我创建了一个context.xml文件并将其放在那里。

    

我写这篇文章时遇到了这个错误

 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.(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进行了一些研究,发现一篇post说如果你有一个旧版本的tomcat,你需要将这个jar添加到你的lib文件夹中。 所以我添加了jar,现在它可以正常工作,但是我想了解一下究竟是什么,因为我使用的是最新的tomcat版本。 那么为什么当我指定工厂时会出现错误。 我正在添加什么是这个jar,为什么关于它的文档很少? 任何有关这里发生的事情的信息将不胜感激。

JDBC驱动程序必须对与数据源工厂本身相同的类加载器可见。 数据源工厂库放在Tomcat自己的/lib文件夹中,因此由Tomcat的“common”类加载器加载。

你的问题听起来很像你在webapp的/WEB-INF/lib删除了JDBC驱动程序。 webapp的/WEB-INF/lib对于“common”类加载器是不可见的。 从技术上讲,您必须将JDBC驱动程序放在Tomcat自己的/lib文件夹中(或者至少在/conf/catalina.propertiescommon.loader设置指定的可配置路径中),以使其对数据可见源工厂。

或者,在您尝试时,将数据源工厂复制到/WEB-INF/lib也将修复它。 webapp的/WEB-INF/lib在类加载方面比Tomcat的/lib文件夹具有更高的优先级。 因此,如果在/WEB-INF/lib找到数据源工厂,它将从那里加载。 正如JDBC驱动程序也在那里,它将被看到。 然而,这不是解决具体问题的正确方法,这是一种解决方法,因此您不应该这样做。

没有专门针对此问题的文档。 但是, Tomcat类加载器HOW-TO将有助于理解Tomcat中的类加载层次结构。

屏幕截图显示具有嵌套“lib”文件夹的Tomcat文件夹,其中包含嵌套的JDBC驱动程序.jar文件

也可以看看:

  • 臭名昭着的java.sql.SQLException:找不到合适的驱动程序
  • 我应该如何连接到基于servlet的应用程序中的JDBC数据库/数据源?
  • 在multithreading系统中使用静态java.sql.Connection实例是否安全?

我有同样的问题,你的解决方案对我不起作用。 我必须将’mysql-connector-java-5.1.30-bin.jar’文件添加到我的lib文件夹才能使用,因为我正在使用该驱动程序:)干杯。