2015-10-05 113 views
1

我有一个奇怪的问题连接到公共托管的静态IP mysql服务器。到远程MySQL DB的JDBC连接失败;

我可以通过MySQL Workbench成功连接服务器,也可以通过SSH连接到本地远程服务器。但是,从jdbc连接器连接到MySQL服务器的尝试(通过NetBeans和通过本地部署的代码均失败)。在查看日志时,考虑到用户凭证是本地用户而不是远程用户,代码正试图与远程服务器连接。所以用户存在于远程,但在尝试连接时,java会考虑user @ localhost。

造成的:java.sql.SQLException中:如出现确切的错误访问被拒绝的用户 'user'@'c-24-130-52-20.hsd1.ca.comcast.net '(使用密码:是) 在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) 〜[MySQL的连接器的Java-5.1.27.jar:NA]在 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]在 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的://用户:密码@ WXYZ/

有人可以请建议如何提及用户,使Java认为它是一个远程用户,而不是我的机器上的本地用户?

+2

我认为错误中的地址表示*您的*机器,而不是它正在尝试连接的机器。 “用户”之后的标识符标识谁正尝试连接。你确定所有远程机器都可以连接到该服务器吗? – RealSkeptic

+0

哦,是的,你说得对。一开始我就不明白这一点是愚蠢的。感谢您指出。是的,我确保通过将bindaddress设置为0.0.0.0,可以从外部对每个人进行远程访问。我会编辑这个问题来解决这个简洁的小问题。谢谢。 – user1242321

+0

但是现在我很好奇如何在连接字符串中提到远程机器的本地用户?我认为用户默认会被认为是远程服务器上的用户,如[email protected]而不是当前的方式。我的宽带上没有静态IP,因此在远程服务器上授予本地用户访问权限也不起作用。 – user1242321

回答

0

这里的问题是:

当MySQL工作台进行连接,连接由于用户名是userName @ WXYZ,因此可以完全访问数据库。但是,当我使用java连接时,它试图连接的用户是userName @ JavaServerIP,而不是[email protected]。所以连接尝试失败,因为userName @ JavaServerIP无法访问。授予这种用户访问MySQL服务器上的数据库解决了我的问题。下面是帮助我解决这个问题的命令:

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

感谢@Neilos和RealSkeptic指出了这一点。 – user1242321

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); 
+0

感谢您的意见。但我正在使用Play框架,并且在内部连接您刚刚提到的方式。提到连接字符串的目的是传达连接细节。 Netbeans连接尝试失败,我认为这应该是非常标准的方式。令人惊讶的是,Mysql工作台正在成功连接。所以这在这种情况下不会有太大的帮助。 :-( – user1242321

+1

不需要调用'Class.forName'。自JDBC 4以来就有了自动发现。 – RealSkeptic