JDBC MySQL自动将localhost转换为127.0.0.1

时间:2013-10-20 16:38:19

标签: java mysql jdbc

我正在尝试通过 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?我已经为localhost配置了登录。

2 个答案:

答案 0 :(得分:5)

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

回答问题"为什么用127.0.0.1替换localhost?":

MySQL docs中,在连接网址中使用localhost表示您要连接到套接字。使用127.0.0.1意味着您希望通过TCP / IP进行连接。

  

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

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

  

Java本身并不支持unix域套接字

所以,我猜,因为JDBC只通过TCP / IP连接,所以它会在内部将localhost转换为127.0.0.1

解决我的问题:

  • 我在MySQL中授予了user@127.0.0.1
  • 的权限
  • 我在我的连接网址中将localhost更改为127.0.0.1

答案 1 :(得分: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访问权限存在问题。这个link可以帮助您解决问题