Java连接MySQL数据库失败的8个关键排查点及解决方案
1. 检查基础配置(出现频率45%)
// 正确连接模板(Java 8+)
String url = "jdbc:mysql://localhost:3306/mydb?"
+ "useSSL=false&" // 禁用SSL(测试环境)
+ "serverTimezone=Asia/Shanghai&" // 必须设置时区
+ "characterEncoding=utf8";
String user = "root";
String password = "123456";
// 加载驱动(新版可省略Class.forName)
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 连接成功...
}
2. 检查驱动依赖(Maven配置)
<!-- pom.xml 必须包含正确版本 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version> <!-- 根据MySQL版本选择 -->
</dependency>
3. 服务状态检查(命令行)
# 检查MySQL服务状态
sudo systemctl status mysql
# 尝试本地连接(排除代码问题)
mysql -u root -p
4. 网络连通性验证
# 测试端口是否开放
telnet 服务器IP 3306
# 检查防火墙(CentOS示例)
sudo firewall-cmd --list-ports
sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
5. 权限配置检查
-- 检查用户权限
SELECT host, user FROM mysql.user;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
FLUSH PRIVILEGES;
6. 查看完整错误日志
try {
// 连接代码...
} catch (SQLException e) {
System.out.println("完整错误信息:");
e.printStackTrace(); // 必须打印完整堆栈
}
7. 版本兼容性检查
MySQL版本 | 推荐驱动版本 |
---|---|
5.6 | 5.1.x |
5.7 | 5.1.x |
8.0 | 8.0.x |
8. 高级配置检查
// 解决时区问题(8.x驱动必须)
String url = "jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai";
// 解决SSL警告
useSSL=false
高频错误对照表:
错误现象 | 解决方案 |
---|---|
Communications link failure | 检查服务状态/网络/防火墙 |
Access denied for user | 检查用户名密码/权限配置 |
The server timezone is invalid | 连接参数添加serverTimezone配置 |
No suitable driver found | 检查驱动依赖/Class.forName |
Public Key Retrieval is not allowed | 添加allowPublicKeyRetrieval=true |
建议按照以上顺序逐步排查,95%的连接问题都可以通过这些步骤解决。如果仍然失败,请提供完整错误日志进行深度分析。