java - 无法从 Java 连接到 MySQL:MySQL 驱动程序连接逻辑中的 NullPointerException
问题描述
我正在尝试连接到我在 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()
抛出这个:
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
:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
更新
经过进一步调查,这似乎是因为引入了以下更改MySQL 8.0.1
:
您报告的问题与 MySQL 8.0.1 中引入的字符集和排序规则支持的更改有关,现在添加了默认字符集“utf8mb4”。此类更改破坏了 Connector/J 初始化连接的方式。
如您所知,这已在 Connector/J 5.1.41 中得到修复,我相信您已经更新了库。
如上所述,解决您的问题的另一种方法是5.1.41
使用5.1.40
.
推荐阅读
- mongodb - Mongoose 聚合:无法使用查找填充 2 级嵌套字段
- c++ - 重载解析在模板函数中的工作方式是否不同?
- bash - 需要读取文件并在两个空行之间抓取每个文本块
- c++ - 在 C++20 中使用 lambda 进行参数包扩展
- graphql - 另一种转换输入类型字段数据的方法?
- r - 为什么我的 Logistic 正则化 glmnet 代码的概率在 0 和 1 之外?
- node.js - 在 NodeJS 的 createServer 函数中的响应参数中获取了哪些数据?
- c# - 如何从已发布的 Web 应用程序中使用 selenium 有效地运行 .net 核心单元测试
- mysql - 插入数据查询在Node js中不起作用
- c++ - 如何使用获取-释放内存顺序模型实现简单的自定义锁?