尝试使用Tomcat 6建立连接池

时间:2010-09-22 14:56:01

标签: datasource tomcat6

我真的在配置Tomcat来设置连接池。我已经完成了很多关于各种论坛和Tomcat文档的阅读,但我不得不在这里作为最后的手段。这是我第一次尝试从容器中获取连接,所以这对我来说都是新的。

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

现在我收到一个SQLNestedException:无法创建PoolableConnectionFactory(''''localhost'(使用密码:YES))

首先,我很惊讶用户是空白的,因为我在context.xml中指定了“root”。至于无法创建PoolableConnectionFactory,我看到了几个具有factory属性的示例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>

我已经看到了一个带有WatedResource元素的context.xml,用于META-INF / context.xml。我尝试了但它似乎没有什么区别,我觉得很奇怪,所以我已经评论过了。我真的要包括它吗?

我的测试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文件中设置某种身份验证?

1 个答案:

答案 0 :(得分:2)

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