mysql - 无法创建 PoolableConnectionFactory(拒绝用户 '' @'localhost' 的访问

标签 mysql datasource tomcat6 mysql-error-1045

过去几天,我一直在尝试为网络应用程序设置数据库连接池,但没有成功。我已经阅读了 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 中删除了默认值。我尝试将 context.xml 放入 [mywebappname]/META-INF/context.xml 但这不仅不起作用,而且导致创建了一个名为 TwitterSearch.xml 的文件,该文件是自动生成的并放入 Tomcat 6.0/conf/Catalina/localhost 目录。所以现在我只是编辑那个,这是我唯一的一个。

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

我们是否缺少一些 jar ?我在 Tomcat 6.0/lib 目录中有 tomcat-dbcp.jar、jconnector.jar 和所有其他我认为应该有的文件。

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

我真的不知道该如何解决这个问题,非常感谢专家的建议。

非常感谢。

最佳答案

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

您需要在 mysql 中授予该用户访问权限。虽然 Java 将连接到本地主机,但它会使用 tcp/ip 来连接——但是在 mysql 中,本地主机和 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”

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

正如您现在拥有的那样,明文密码。

关于mysql - 无法创建 PoolableConnectionFactory(拒绝用户 '' @'localhost' 的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3782197/

相关文章:

javascript - PHP/Ajax - 多个 GET 参数

mysql - 错误 1055,SELECT 列表的表达式 #1 不在 GROUP BY 子句中

grails - 根据传递的参数连接到数据库

c# - 从使用数据源的列表框中删除和修改所选项目

hibernate - 导入 quarkus-hibernate-orm 后如何使用 Oracle 数据库配置 Quarkus?

grails - 当部署为War Tomcat 6时,Spring Security Grails插件失败

mysql - 我们如何使用 Sequelize 执行以下原始查询?

SQL COUNT 返回使用特定属性的项目数

Java:使用端点将webservice发布到tomcat服务器

tomcat - Alfresco SSL 握手异常