【问题标题】:Tomcat and JDBC connection poolingTomcat 和 JDBC 连接池
【发布时间】:2012-03-02 00:55:18
【问题描述】:

我正在尝试使用 tomcat 设置与 mysql 数据库的连接池。我的简单应用程序称为 Projekt,在我的 Apache/conf/Catalina/localhost 的 Projekt.xml 中,我有

<Context docBase="Projekt.war" path="/Projekt">
  <Resource name="jdbc/mysqldb"
      auth="Container"
  factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/Music"
      username="andrzej"
      password="qazxsw"
      maxActive="20"
      maxIdle="30"
      maxWait="5"
  />
</Context> 

我的应用的 web.xml

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>org.jtp.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/Hai</url-pattern>
</servlet-mapping>

<resource-ref>     
        <description>DB Connection</description>     
       <res-ref-name>jdbc/mysqldb</res-ref-name>     
       <res-type>javax.sql.DataSource</res-type>     
       <res-auth>Container</res-auth>     
 </resource-ref>

在我的 Apache/lib 文件夹中,我有

mysql-connector-java-5.1.18-bin.jar

但是当我执行这段代码时:

Context initContext  = new InitialContext();
dataSource = (DataSource)initContext.lookup("java:comp/env/jdbc/mysqldb");
System.out.println(dataSource.getConnection().createStatement().
            execute("select * from Users"));

我得到异常

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

我现在很困惑,在某些地方我读到它可能是由于没有将驱动程序放在 tomcat/lib 中造成的,但我有它并且它可以工作,因为当我使用手动连接测试驱动程序时它工作了。

对于我的设置,我试图遵循 http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

编辑: 终于让它工作了,似乎我在其中一个文件中有一些左上下文标签,所以在解析时他覆盖了其他属性,所以最后都是我的错。

【问题讨论】:

    标签: java mysql tomcat servlets jdbc


    【解决方案1】:

    要使用 Tomcat 实现 JDBC 连接池,有一个 XML 的替代方法 配置文件。我从来没有让那些 Contextresource-ref 标签工作。此外,如果您真的不需要 JNDI 功能,这些标签就显得多余了。

    另一种方法是使用 Java 代码配置 Tomcat 的 JDBC 连接池。请参阅 Tomcat 7 文档页面的 Plain Ol' Java 部分中的示例代码,The Tomcat JDBC Connection Pool

    基本上,你:

    1. 实例化一个PoolProperties 对象来存储您的设置(数据库的URL、数据库用户名、数据库密码等)。
    2. 实例化一个 Tomcat DataSource 对象,同时从上面的第 1 步传递 PoolProperties 对象。

    简单易懂。像这样……

    PoolProperties p = new PoolProperties();
    p.setUrl( jdbc:postgresql://localhost:5432/" + "my_database_name" );
    p.setDriverClassName( "org.postgresql.Driver" );
    p.setUsername( "someUserName" );
    p.setPassword( "somePassword" );
    …
    DataSource datasource = new org.apache.tomcat.jdbc.pool.DataSource( p );
    datasource.setPoolProperties(p);
    

    要使用数据源……

    Connection conn = null;
    try {
        conn = datasource.getConnection();
        …
    

    可以存储DataSource实例:

    【讨论】:

    • 这太棒了。谢谢。
    【解决方案2】:

    您好像不见了Context envCtx = (Context) initCtx.lookup("java:comp/env");
    JNDI 查找应该像这样完成:

    // Obtain our environment naming context
    Context initCtx = new InitialContext();
    Context envCtx = (Context) initCtx.lookup("java:comp/env");
    
    // Look up our data source
    DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB");
    
    // Allocate and use a connection from the pool
    Connection conn = ds.getConnection(); 
    

    来自http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html的文档。

    【讨论】:

    • 还是同样的错误,我以前用过这个结构,但是在某个地方我找到了我引用的那个,无论如何它们都返回相同的错误。
    • 听起来这家伙也有同样的问题,并发布了解决方案blogs.agilefaqs.com/2009/11/23/…
    • 仍然没有,我可以写入这个文件夹,我什至在我的webapp中创建了contex.xml,仍然是同样的错误。
    • 您是否在每次重建时都删除了 TOMCAT_HOME/Webapp/Projekt 文件夹?我发现如果我使用 .wars tomcat 并不总是清除旧代码。
    • 我试过了,即使在我使用的 Eclipse 中也会出现这个问题。但我认为链接中建议的 xml 文件中可能存在某些内容,因为我得到了这个空 url 并且没有类,我想知道可能出了什么问题。
    猜你喜欢
    • 2013-05-01
    • 2014-12-26
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2012-07-12
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多