我正在尝试通过 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配置了登录。
答案 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
。
解决我的问题:
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可以帮助您解决问题