【问题标题】:Configure DBCP inside of Tomcat在 Tomcat 内部配置 DBCP
【发布时间】:2014-07-25 08:27:33
【问题描述】:

我正在尝试将 DataSource 注入 Servlet。最后我用@Resource 注释了数据源字段,并且在那里注入了一些DBCP 的BasicDataSource。但它没有配置。没有 db url,没有驱动程序类,什么都没有。自然地,我在尝试getConnection() 时得到了 NullPointerException。我做错了什么?

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

    <servlet>
        <servlet-name>testServlet</servlet-name>
        <servlet-class>ua.test.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>testServlet</servlet-name>
        <url-pattern>/serve</url-pattern>
    </servlet-mapping>
    <resource-ref>
        <res-ref-name>jdbc/MyDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <injection-target>
            <injection-target-class>ua.test.TestServlet</injection-target-class>
            <injection-target-name>dataSource</injection-target-name>
        </injection-target>
    </resource-ref>

</web-app>

context.xml

<?xml version='1.0' encoding='utf-8'?>

<Context>

    <Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource"
              maxActive="10" maxIdle="30" maxWait="10000"
              username="tomcat" password="tomcat" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/test"/>

</Context>

【问题讨论】:

    标签: tomcat7 apache-commons-dbcp


    【解决方案1】:

    显然没有人在乎我的悲伤。所以我会自己回答。 Tomcat 在org.apache.tomcat.jdbc 包下有它自己的(可能已修改)Apache Commons DBCP 副本,但出于某些愚蠢的原因,还包括org.apache.commons.dbcp 包下的原始 DBCP。当我尝试使用 @Resource 注释注入 Datasource 时会发生什么是 Tomcat 从原始包中实例化 Datasource 并将此实例注入我的字段。为了让 Tomcat 使用他自己的 DBCP 副本,我必须修改我的 context.xml 如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    <Resource name="jdbc/MyDB"
                  factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
                  auth="Container" type="javax.sql.DataSource"
                  maxActive="10" maxIdle="30" maxWait="10000"
                  username="tomcat" password="tomcat"  
                  driverClassName="com.mysql.jdbc.Driver"
                  url="jdbc:mysql://localhost:3306/test"/>
    </Context>
    

    基本上我只是添加了这一行:

    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    

    感谢所有知道原因但忽略这个问题这么久的人:-)

    【讨论】:

    • 不...不在乎您的悲伤...但一定要感谢您的回答;)
    猜你喜欢
    • 2011-06-24
    • 2011-06-10
    • 2011-06-26
    • 2014-05-19
    • 2012-04-29
    • 1970-01-01
    • 2012-01-25
    • 2011-08-08
    • 2011-07-11
    相关资源
    最近更新 更多