【发布时间】:2017-03-28 14:14:40
【问题描述】:
凭据正确,数据库名称正确,MySQL 用户设置正确并拥有所有权限,我有 'username'@'%' 和 'username'@'localhost' 的条目,我可以连接到这个用户通过命令行正确,以及通过 mysql 工作台。换句话说,除了我的 java 应用程序无法连接之外,一切都按应有的方式运行并设置为应有的状态。
我做了大约 3 次干净的 MySQL 卸载和安装,重新启动,没有重新启动,尝试以 root 身份通过应用程序登录(通过),但没有成功,尝试以没有密码的用户身份通过应用程序登录(同样的错误) 等。
此外,使用完全相同的登录名在 localhost 上运行的 PHP 网站也可以完美运行。
在过去的 3 天里,我一直在检查和重新检查并尝试所有这些,我浏览了所有相关的 SO 问题,我能找到的所有博客和文档,所有这些。
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://localhost/correctDBname", "correctUsername", "correctPassword");
} catch(ClassNotFoundException | SQLException ex) {
Logger.getLogger(SqlConnection.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
}
MySQL 驱动程序名称与项目中 NetBeans 的“库”部分中的名称完全相同:MySQL JDBC 驱动程序 - mysql-connector-java-5.1.23-bin.jar
异常全文:
java.sql.SQLException: Access denied for user 'strada'@'localhost' (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:925)
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1704)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1250)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at eu.storemedia.stradaserver.engine.SqlConnection.<init>(SqlConnection.java:23)
at eu.storemedia.stradaserver.engine.StradaServer.<init>(StradaServer.java:51)
at eu.storemedia.stradaserver.Home.<clinit>(Home.java:31)
【问题讨论】:
-
至少添加你的问题的例外
-
你用的是什么版本的MySql驱动?
-
@Robin 对不起,你把它添加到 OP 是对的
-
@RobertoLinares 如果未指定,则驱动程序默认使用端口 3306。
-
考虑升级驱动,5.1.23是2013年的,最新版本是5.1.41,比如你可能在5.1.27修复了一个bug("JDBC authentication failed when there is乱码中的空字节,因为 com.mysql.jdbc.MysqlIO.doHandshake 在读入乱码的前 8 个字节时只读取到第一个空字节。(Bug #16723048,Bug #62469)" )