3

我正在尝试通过localhost从 JDBC 连接到 MySQL 。但是连接失败。在异常中,我看到 JDBC 正在尝试连接到127.0.0.1

    String connectionString = "";
    try {
        loadProperties();
        Class.forName("com.mysql.jdbc.Driver");
        // Setup the connection with the DB
        connectionString = "jdbc:mysql://" + properties.getProperty("host") + "/" + properties.getProperty
                ("database") + "?user=" + properties.getProperty("user") + "&password=" + properties
                .getProperty
                        ("password");
        connect = DriverManager
                .getConnection(connectionString);
        logger.debug("Connected to " + properties.getProperty("host"));
    } catch (Exception e) {
        logger.error("Database Connection failed with connection string - " + connectionString,e);
    }

从日志:

Database Connection failed with connection string - jdbc:mysql://localhost/testdb?user=testuser&password=testpass

java.sql.SQLException: Access denied for user 'testuser'@'127.0.0.1' (using password: YES)

为什么用 127.0.0.1 替换 localhost?我只为本地主机配置了登录。

4

2 回答 2

6

遇到同样的问题时,我偶然发现了这个问题。

要回答“为什么要用 127.0.0.1 替换 localhost?”这个问题:

MySQL docs中,localhost在您的连接 URL 中使用意味着您想要连接到一个套接字。Using127.0.0.1表示您希望通过 TCP/IP 进行连接。

在 Unix 上,MySQL 程序对主机名 localhost 进行了特殊处理,与其他基于网络的程序相比,这种方式可能与您所期望的不同。对于到 localhost 的连接,MySQL 程序尝试使用 Unix 套接字文件连接到本地服务器。... 为确保客户端与本地服务器建立 TCP/IP 连接,请使用 --host 或 -h 指定主机名值 127.0.0.1

根据这个答案,似乎默认情况下 JDBC 仅支持 TCP/IP 连接,至少对于某些 Java 版本。原始来源: http: //lists.mysql.com/java/8749

Java 本身不支持 unix 域套接字

所以,我猜想由于 JDBC 只通过 TCP/IP 连接,它会 localhost127.0.0.1内部转换。

为了解决我的问题:

  • 我在 MySQL 中授予了权限user@127.0.0.1
  • 我在我的连接 URL 中更改localhost为。127.0.0.1
于 2016-01-04T21:52:31.950 回答
1

IP 地址 127.0.0.1 是为每台计算机保留的专用地址。127.0.0.1 通常是计算机的环回地址。网络软件和实用程序可以使用 127.0.0.1 访问本地计算机的 TCP/IP 网络资源。发送到环回 IP 地址(如 127.0.0.1)的消息不会到达局域网 (LAN),而是由计算机自己的网络适配器自动重新路由回 TCP/IP 堆栈的接收端。简单来说,localhost也可以称为127.0.0.1。MySql 访问权限有问题。此链接将帮助您解决它

于 2013-10-20T16:43:21.120 回答