【问题标题】:Try to make a Connection Pool with Tomcat 6尝试使用 Tomcat 6 建立连接池
【发布时间】:2010-09-22 14:56:00
【问题描述】:

配置 Tomcat 以设置连接池我真的做噩梦了。我已经阅读了大量的各种论坛和来自 Tomcat 的文件,但作为最后的手段,我不得不在这里提问。这是我第一次尝试从容器中获取连接,所以这对我来说是全新的。

我一直有 NameNotFoundException,它似乎只有在我将 context.xml 文件从 MyApp/META-INF/context.xml 放回 Tomcat 6.0/conf/context.xml 时才得到修复,所以由于某种原因它没有看到MyApp 的 META-INF 目录中的 context.xml 文件。有什么想法吗?

现在我得到一个 SQLNestedException: Cannot create PoolableConnectionFactory (''@'localhost' (using password:YES))

首先让我感到惊讶的是,用户是空白的,因为我在 context.xml 中指定了“root”。至于无法创建 PoolableConnectionFactory,我已经看到了几个具有工厂属性的示例 context.xml 文件。我需要这个吗?如果是这样,我应该在那里指定什么类?

我的 context.xml 是:

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

<!-- Configure a JDBC DataSource for the user database -->
<Resource name="jdbc/searchdb" 
          type="javax.sql.DataSource" 
          auth="Container" 
          user="root" 
          password="mypassword" 
          driverClassName="com.mysql.jdbc.Driver" 
          url="jdbc:mysql://localhost:3306/search" 
          maxActive="8" 
          maxIdle="4"/>

<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!--<WatchedResource>META-INF/context.xml</WatchedResource>-->

</Context>

我看到了一个 context.xml,它带有一个用于 META-INF/context.xml 的 WatchedResource 元素。我试过了,但它似乎没有什么不同,而且对我来说似乎很奇怪,所以我把它注释掉了。我真的应该包括它吗?

我的测试 servlet:

package search.web;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import search.model.*;
public class ConPoolTest extends HttpServlet {

    public void doGet(HttpServletRequest request,
                  HttpServletResponse response) 
                  throws IOException, ServletException {
        Context ctx = null;
        DataSource ds = null;
        Connection conn = null;
        try {
            ctx = new InitialContext();
            ds = (DataSource)ctx.lookup("java:comp/env/jdbc/searchdb");
            conn = ds.getConnection();
            if(conn != null) {
                System.out.println("have a connection from the pool");
            }
        } catch(SQLException e) {
            e.printStackTrace();
        } catch(NamingException e) {
            e.printStackTrace();
        } finally {
            try {
                if(conn!=null) {
                    conn.close();
                }
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

期待您的建议。

非常感谢

PS 我也会列出堆栈跟踪,但由于某种原因,它显示在控制台中,而不是日志中。

更新:

现在我再次查看错误消息,我想知道是什么拒绝了我的访问。我假设它是数据库,但它实际上是容器吗?我是否需要在 tomcatusers.xml 文件中设置某种身份验证?

【问题讨论】:

    标签: datasource tomcat6


    【解决方案1】:

    Tomcat docs for JNDI Datasources 包含如何在context.xml 中设置 JDBC 数据源的完整示例

    您的问题的一些问题:

    1. Tomcat 应该在部署期间(当它解压您的应用程序时)将 context.xml 从应用程序的 WAR 复制到 conf/Catalina/localhost/app.xml。该文件应该转到conf/。检查这些地方是否有旧副本并清理干净。

    2. 使用错误用户的错误还表明存在多个context.xml,并且您正在查看错误的用户。

    3. 您不需要 PoolableConnectionFactory 与 Tomcat 6。这可能是 Tomcat 5 更新后遗留的问题,或者出现了问题,他们尝试了几件事,却忘记清理配置文件。

    4. Tomcat 自动监视web.xml;无需再次将其设为WatchedResource

    【讨论】:

    • 嗨亚伦,非常感谢您的回复
    • 我现在没有使用 WAR 文件部署我的应用程序,而只是手动传输文件。是否需要 WAR 文件才能让 Tomcat 正确定位给定 Web 应用的 META-INF 目录中的 context.xml 文件?
    • 我已经检查过了,我现在肯定已经从 conf 目录中删除了 context.xml。 Tocat 文档说我可以在 $CATALINA_BASE/conf/[enginename]/[hostname][webappname].xml 或 $CATALINA_BASE/webapps/[webappname]/META-INF/context.xml 中有一个文件。我已经更新了两者的细节并尝试删除第一个,但它只是作为第二个的完整副本再次放入。所以我现在收到关于 PoolableConnectionFactory 的相同消息。我使用的是 Tomcat 6,而 webapp 是我自己的一个非常简单的应用程序,所以我不明白为什么会出现这些问题。
    • @Joe:看起来有人在为您复制文件。您是否使用 IDE 的自动部署功能?这可以解释为什么该文件刚刚出现。另请注意,如果以这种方式创建 DB 连接,则必须将 DB 驱动程序 JAR 添加到 tomcat 的类路径中(通过将其复制到 tomcat/lib/ 中)
    • 嗨亚伦。不,我不使用 IDE,目前只使用 Notepad++。并感谢您的提示并将 jar 添加到 Tomcat/lib。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多