与远程MySQL数据库的JDBC连接失败;

时间:2015-10-05 10:14:42

标签: java mysql jdbc

我有一个奇怪的问题,连接到公开托管的静态IP mysql服务器。

我能够通过MySQL Workbench成功连接到服务器,也可以通过SSH连接到本地远程服务器。但是,从jdbc连接器尝试连接到mysql服务器(通过NetBeans和本地部署的代码都失败)。在查看日志时,代码正在尝试连接远程服务器,因为用户凭据是本地用户而不是远程用户。因此用户存在于远程,但java在尝试连接时会考虑用户@ localhost。确切的错误显示为:

  

引起:java.sql.SQLException: 用户拒绝访问   'user'@'c-24-130-52-20.hsd1.ca.comcast.net' (使用密码:YES)     在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)   〜[mysql-connector-java-5.1.27.jar:na] at   com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)   〜[mysql-connector-java-5.1.27.jar:na] at   com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)   〜[mysql-connector-java-5.1.27.jar:na] at   com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:928)   〜[mysql-connector-java-5.1.27.jar:na] at   com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1750)   〜[MySQL的连接器的Java-5.1.27.jar:NA]

我的连接字符串是:

  

JDBC:MySQL的://用户:password@W.X.Y.Z/

有人可以建议如何提及用户,以便java认为它是远程用户而不是我机器上的本地用户吗?

2 个答案:

答案 0 :(得分:0)

我不知道这是否能解决您的问题,但您最好使用提供的API进行连接,而不是手动构建连接字符串。

这会使错误变得更难(难以诊断)并使参数替换变得更容易:

String username = "testuser";
String password = "test123";
String url = "jdbc:mysql://ip-address/databaseName";
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
Connection conn = DriverManager.getConnection (url, username, password);

答案 1 :(得分:0)

这里的问题是:

当MySQL Workbench连接时,连接成功,因为用户是userName@W.X.Y.Z,它具有对DB的完全访问权限。但是当我使用java连接时,它尝试连接的用户是userName @ JavaServerIP,而不是userName@W.X.Y.Z。因此,连接尝试失败,因为userName @ JavaServerIP没有访问权限。授予这样的用户访问mysql服务器上的数据库解决了我的问题。这是帮助我解决这个问题的命令:

GRANT ALL PRIVILEGES ON my_database.* TO 'my_user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;