2010-09-23 83 views
7

我一直在试图设置一个Web应用程序的DatabaseConnectionPool在过去的几天没有成功我已经阅读了Tomcat文档的相关部分和周围的主题了大量工作,认为我做的一切权利,但显然不是,因为我不断收到以下错误:无法创建PoolableConnectionFactory(访问拒绝用户'''本地主机'

Cannot create PoolableConnectionFactory (Access denied for user ''@'localhost' (using password: YES)) 

我没有得到的错误,当我启动Tomcat运行,但是当我尝试运行以下servlet:

package twittersearch.web; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import java.io.*; 
import java.util.*; 
import java.sql.*; 
import javax.sql.*; 
import javax.naming.*; 
import twittersearch.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/twittersearchdb"); 
      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(); 
      } 
     } 
    } 
} 

上下文对于Web应用程序是:

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

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


</Context> 

我真不明白的是为什么错误不说,访问被拒绝“根” @“localhost”的时候,我指定这是用户。

我已经试过什么:

我是否有重复的context.xml?不,我删除了Tomcat 6.0/conf中的默认值。我尝试在[mywebappname] /META-INF/context.xml中放置一个context.xml,但不仅这样做不起作用,而且导致创建一个名为TwitterSearch.xml的文件,该文件被自动生成并放入Tomcat 6.0/conf/Catalina/localhost目录。所以现在我只是编辑那个,那是我唯一的一个。

它是Tomcat的版本吗?那么,我完全重新安装了最新版本的Tomcat 6.0,所以我不认为是这样。

我们是否缺少一些罐子?我有tomcat-dbcp.jar,jconnector.jar以及我认为应该在Tomcat 6.0/lib目录中拥有的其他所有其他目录。

当我查看MySQL数据库中的密码时,他们似乎已将安全目的编码为长字母数字字符串。这是正常的吗?我应该在我的context.xml中还是只有普通密码?

我真的不知道如何解决这个问题,真的很感谢一些专家的建议。

非常感谢提前。

Joe

回答

9

你的设置看起来不错。这看起来纯粹是一个权限问题。

您需要授予该用户在mysql中的访问权限。虽然Java会连接到本地主机,但它会使用tcp/ip - 但是在mysql localhost和127.0.0.1中有不同的含义。发布这个SQL应该可以做到。

grant all on twitter.* to 'root'@'127.0.0.1' identified by 'mypwd'; 

,它假定的Java解决“本地主机”为127.0.0.1,如果事情仍不能正常工作,你可以尝试改变你的连接字符串为“jdbc:mysql的://127.0.0.1:3306 /叽叽喳喳”

Should I have this in my context.xml or just the normal password?

正如您现在使用明文密码。

+1

您好,非常感谢您的回复。我玩了你提供的GRANT ALL语句。出于某种原因,唯一可行的是当我; – Joe 2010-09-24 09:07:24

+0

GRANT ALL在Twitter上。*'''localhost'IDENTIFIED BY'mypwd'; – Joe 2010-09-24 09:07:58

+0

我已经删除了root用户,所以唯一的用户是''@ localhost',它的工作原理。虽然我很高兴它的工作原理,但仍然有些不对,因为我在应用程序context.xml中指定用户是'root',所以我想知道为什么''会起作用,而事实上是我的错误信息得到先验总是拒绝访问''@'localhost'而不是'root'@'localhost'。你有什么想法,为什么这可能是这种情况? – Joe 2010-09-24 09:10:55

1

在您的webapp配置context.xml中,您必须通过username =“root”更改user =“root”

相关问题