过去几天我一直在尝试为Web应用程序设置DatabaseConnectionPool但没有成功。我已经阅读了Tomcat文档的相关部分以及关于该主题的大量内容,并认为我正在做的一切正确,但显然不是因为我继续得到以下错误:
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();
}
}
}
}
webapp的上下文是:
<?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>
我真正不明白的是,当我指定那是用户时,错误并不是说“root”@“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中使用它还是只使用普通密码?
我真的不知道如何解决这个问题,并且非常感谢一些专家建议。
非常感谢提前。
乔
答案 0 :(得分:11)
您的设置看起来很好。这看起来纯粹是一个权限问题。
您需要在mysql中授予该用户访问权限。虽然Java将连接到localhost,但它将使用tcp / ip这样做 - 但是在mysql localhost和127.0.0.1中有不同的含义。发布这个SQL应该可以解决问题。
grant all on twitter.* to 'root'@'127.0.0.1' identified by 'mypwd';
假设Java将“localhost”解析为127.0.0.1,如果仍然无效,您可以尝试将连接字符串更改为“jdbc:mysql://127.0.0.1:3306 / twitter”
我应该在context.xml中使用它吗? 或只是普通密码?
如你所知,明文密码。
答案 1 :(得分:2)
在webapp的配置context.xml中,您必须通过username =“root”更改user =“root”
答案 2 :(得分:0)
就我而言(MySql v.5.7),由于通过 GRANT 命令创建用户,我收到此错误:
GRANT ALL PRIVILEGES ON *.* TO myuser@localhost IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
改用 CREATE 命令,解决了上述错误:
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON *.* TO myuser@localhost WITH GRANT OPTION;
希望对大家有所帮助