我正在尝试连接到在Java程序中使用MySQL创建的数据库,但是它总是失败。
为了举例,这是我的代码:
import java.sql.*; public class Squirrel { public static void main(String[] args) { String user; String password; Connection connection; Statement statement; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection( "jdbc:mysql://localhost:3306", user, password); statement = connection.createStatement(); // Other code } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } finally { try { if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
我能够从IntelliJ中连接到数据库,并将添加的内容mysql-connector- java-5.1.40.jar添加到项目中,但是每次我运行程序时都会DriverManager.getConnection()抛出此错误:
mysql-connector- java-5.1.40.jar
DriverManager.getConnection()
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.Util.getInstance(Util.java:408) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2330) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:678) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229) at Squirrel.main(Squirrel.java:12) Caused by: java.lang.NullPointerException at com.mysql.jdbc.ConnectionImpl.getServerCharset(ConnectionImpl.java:2997) at com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1934) at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1863) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284) ... 13 more
可能是因为您使用的是旧版的MySQL驱动程序。您应该尝试使用最新版本。
要获取最新版本,可以检查https://mvnrepository.com/artifact/mysql/mysql-connector- java
截至目前,最新版本为8.0.11。您可以在此处下载或将其添加到您的pom.xml:
pom.xml
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency>
经过进一步调查,似乎是由于引入了以下更改MySQL 8.0.1:
MySQL 8.0.1
您报告的问题与MySQL 8.0.1中引入的有关字符集和排序规则支持的更改有关,并且新增了默认字符集’utf8mb4’。此类更改破坏了Connector / J初始化连接的方式。 如您所知,此问题已在Connector / J 5.1.41中修复,并且我确定您已经更新了库。
您报告的问题与MySQL 8.0.1中引入的有关字符集和排序规则支持的更改有关,并且新增了默认字符集’utf8mb4’。此类更改破坏了Connector / J初始化连接的方式。
如您所知,此问题已在Connector / J 5.1.41中修复,并且我确定您已经更新了库。
参考
就像上面提到的,解决您问题的另一种方法是使用5.1.41而不是5.1.40。
5.1.41
5.1.40