我有一个奇怪的问题,连接到公开托管的静态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认为它是远程用户而不是我机器上的本地用户吗?
答案 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;