Java 我必须在哪里放置Tomcat的JDBC驱动程序';谁的连接池?

Java 我必须在哪里放置Tomcat的JDBC驱动程序';谁的连接池?,java,tomcat,jdbc,connection-pooling,Java,Tomcat,Jdbc,Connection Pooling,所以我已经找出了我的错误,现在我只是想了解到底发生了什么。我使用的是ApacheTomcat版本7.0.32。我正在使用为JDBC设置池。在我的META-INF文件夹中,我创建了一个context.xml文件,并将其放入其中 <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource type="javax.sql.DataSource" name="jdbc/gmustudent"

所以我已经找出了我的错误,现在我只是想了解到底发生了什么。我使用的是ApacheTomcat版本7.0.32。我正在使用为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>
我之所以想要确保我拥有它,是因为在ApacheTomcat教程中它说

factory is required, and the value should be org.apache.tomcat.jdbc.pool.DataSourceFactory

然后我对So做了一些研究,发现一篇帖子说,如果你有旧版本的tomcat,你需要添加到你的lib文件夹中。所以我添加了jar,现在它可以工作了,但是我想知道到底发生了什么,因为我使用的是最新的tomcat版本。那么,为什么在指定工厂时会出现错误呢。我要添加的这个罐子是什么?为什么关于它的文档很少?非常感谢您提供有关这里发生的一切的信息。

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

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

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

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

另见:

    • 我也有同样的问题,你的解决方案对我不起作用。 我必须将“mysql-connector-java-5.1.30-bin.jar”文件添加到我的lib文件夹中才能工作,因为我使用的是那个驱动程序:)
      干杯。

      谢谢谢谢谢谢!你真的是最好的!我理解你所说的一切,以及为什么我会出错。我唯一不明白的是“Tomcat自己的/lib”文件夹在哪里?我目前正在使用eclipse,我的工作区中有两个文件夹。gmustudent和服务器。当我展开服务器时,我会在localhost config中看到一个文件夹Tomcat v7.0 Server,其中有两个XML文件。我试着把它放在那个文件夹里,但那是个错误!所以我为第二个问题道歉,但是你说的是什么意思本地磁盘文件系统上Tomcat安装文件夹中的“Tomcat自己的/lib文件夹”。例如
      C:\path\to\apache-tomcat-7.0.30
      。这不是从Eclipse内部管理的。我回答中提到的
      /conf
      文件夹也在那里。哇,这太有道理了!我真希望能和你谈上几个小时!如果你不介意的话,我有几个问题想澄清一下。1) 您说数据源工厂在那个lib文件夹中。它在哪个罐子里?2) 这可能是与1类似的答案,但factory=“org.apache.tomcat.jdbc.pool.DataSourceFactory”的确切位置在哪里?这是指向该文件夹中的jar还是指向其他地方?3) 从现在起,我应该将jdbc驱动程序保存在那个lib文件夹中,还是最好将它放在WEB-INF/lib中,除非您在其他地方需要它,如本场景所示?它是
      tomcat jdbc.jar
      文件。工厂值是完全限定的类名,它将被传递到Tomcat内部代码中的
      class#forName()
      ,以便加载和实例化。是的,JDBC驱动程序JAR文件应该保存在Tomcat的
      /lib
      中(或者至少保存在
      common.loader
      属性指定的路径中)。它实际上是用户名/密码组合,对于JDBC URL中指定的给定DB不被接受。注意区分大小写和空格。还要确保JDBCURL中的DB名称是正确的。JDBC驱动程序,一切正常。否则就不会达到你现在的状态。如果无效,请联系主机支持。
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      
      factory is required, and the value should be org.apache.tomcat.jdbc.pool.DataSourceFactory