数据库连接不上是新人高频问题,报错信息五花八门但根因就那几个。这节给你4个核心排查点,按顺序查,准能找到问题。
一、常见报错信息
SpringBoot报错
TEXT
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException:
Communications link failure
The last packet sent successfully to the server was 0 ms ago.
HikariCP报错
TEXT
HikariPool-1 - Failed to obtain connection from database
Caused by: CommunicationsException: Communications link failure
MyBatis报错
TEXT
org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException
IDEA数据库工具报错
TEXT
Connection refused: connect
不管哪种报错,本质都是:程序连不上MySQL。按以下4个点排查。
二、排查点1:MySQL服务是否启动
这是最常见的原因,别笑,很多新人忘了启动MySQL。
Windows检查
Shell
# 查看MySQL服务状态
net start | findstr MySQL
# 或在服务列表查看
sc query MySQL80
如果输出包含RUNNING,说明服务在运行。
如果没输出或显示STOPPED:
Shell
# 启动MySQL服务
net start MySQL80
# 或者在"服务"管理器里启动
# Win+R → services.msc → 找到MySQL → 右键启动
Docker检查
Shell
# 查看MySQL容器是否运行
docker ps | findstr mysql
# 如果没运行,启动它
docker start mysql-container
验证能否连上
Shell
# 命令行连接
mysql -u root -p
能进去说明MySQL服务正常。
三、排查点2:连接信息是否正确
配置文件里的URL、用户名、密码、数据库名,任何一个错了都连不上。
检查配置文件
YAML
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/my_project?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&allowPublicKeyRetrieval=true
username: root
password: Root@123456
driver-class-name: com.mysql.cj.jdbc.Driver
逐项核对
| 配置项 | 检查内容 |
|---|---|
| host | 127.0.0.1或localhost(本地) |
| port | 3306(如果你改过端口,确认一致) |
| 数据库名 | URL里/3306/后面那个,确认数据库已创建 |
| username | root或其他用户名 |
| password | 密码对不对,注意大小写 |
| driver-class-name | MySQL 8.x用com.mysql.cj.jdbc.Driver,5.x用com.mysql.jdbc.Driver |
常见错误
错误1:数据库名写错了
URL里写的是my_project,但数据库实际叫myproject。
SQL
-- 检查数据库是否存在
SHOW DATABASES;
错误2:密码错了
密码大小写敏感,Root@123456和root@123456不一样。
重置密码(参考第1章第4节)。
错误3:driver-class-name版本不对
TEXT
Loading class `com.mysql.jdbc.Driver'. This is deprecated.
MySQL 8.x要用新的驱动类名:
YAML
driver-class-name: com.mysql.cj.jdbc.Driver
错误4:URL参数缺失
MySQL 8.x连接时可能需要这些参数:
TEXT
useSSL=false # 不用SSL
serverTimezone=Asia/Shanghai # 时区
characterEncoding=utf-8 # 编码
allowPublicKeyRetrieval=true # 允许公钥检索
四、排查点3:网络和防火墙
1. 检查端口是否监听
Shell
# 检查3306端口
netstat -ano | findstr 3306
如果有输出包含LISTENING,说明MySQL在监听这个端口。
如果没有输出:
- MySQL服务没启动
- MySQL配置了只监听特定IP
2. 检查bind-address
MySQL配置文件my.ini:
ini
[mysqld]
# 如果这行存在且是127.0.0.1,只能本地连
bind-address = 127.0.0.1
# 如果要远程连接,改成
bind-address = 0.0.0.0
改完重启MySQL。
3. 检查防火墙
Windows防火墙:
Shell
# 检查3306是否被防火墙阻止
netsh advfirewall firewall show rule name=all | findstr 3306
如果没有放行规则:
Shell
# 添加放行规则
netsh advfirewall firewall add rule name="MySQL 3306" dir=in action=allow protocol=TCP localport=3306
4. 远程连接额外检查
如果是远程连数据库:
- 确认远程MySQL的host不是
127.0.0.1 - 确认用户有远程访问权限:
SQL
-- 查看用户允许的host
SELECT user, host FROM mysql.user WHERE user = 'root';
-- 如果只有localhost,创建远程用户
CREATE USER 'root'@'%' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
- 确认VPN是否连接(有些公司数据库在内网,需要VPN)
五、排查点4:认证方式兼容性
MySQL 8.0认证方式问题
MySQL 8.0默认认证插件是caching_sha2_password,有些旧客户端和驱动不支持。
报错:
TEXT
Public Key Retrieval is not allowed
或:
TEXT
Client does not support authentication protocol requested by server
解决方法1:URL加参数
YAML
url: jdbc:mysql://127.0.0.1:3306/mydb?allowPublicKeyRetrieval=true&useSSL=false
解决方法2:改认证方式
SQL
-- 登录MySQL
mysql -u root -p
-- 改成旧版认证方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;
解决方法3:改MySQL配置
my.ini:
ini
[mysqld]
default_authentication_plugin=mysql_native_password
改完重启MySQL。
六、其他常见问题
问题1:连接超时
TEXT
Caused by: java.net.SocketTimeoutException: connect timed out
原因: 网络不通或防火墙阻止。
解决:
- 确认MySQL服务在运行
- 确认端口没有被防火墙拦截
- 如果是远程连接,确认网络可达:
ping 数据库IP - 增加超时时间:
YAML
spring:
datasource:
hikari:
connection-timeout: 60000 # 60秒
问题2:连接数太多
TEXT
Caused by: java.sql.SQLTransientConnectionException:
HikariPool-1 - Connection is not available, request timed out after 30000ms
原因: 连接池满了,获取不到连接。
排查:
SQL
-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';
-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';
-- 查看活跃连接
SHOW PROCESSLIST;
解决:
- 关掉不用的数据库连接(IDEA的Database面板、Navicat等)
- 增大MySQL最大连接数:
SQL
SET GLOBAL max_connections = 200;
- 增大连接池大小:
YAML
spring:
datasource:
hikari:
maximum-pool-size: 20
问题3:SSL报错
TEXT
Caused by: javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
解决: URL加useSSL=false:
YAML
url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false
问题4:时区报错
TEXT
Caused by: java.sql.SQLException:
The server time zone value 'xxx' is unrecognized
解决: URL加时区参数:
YAML
url: jdbc:mysql://127.0.0.1:3306/mydb?serverTimezone=Asia/Shanghai
或者修改MySQL时区:
SQL
SET GLOBAL time_zone = '+8:00';
SET SESSION time_zone = '+8:00';
问题5:数据库不存在
TEXT
Caused by: java.sql.SQLSyntaxErrorException:
Unknown database 'my_project'
解决: 创建数据库:
SQL
CREATE DATABASE my_project DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
问题6:权限不足
TEXT
Caused by: java.sql.SQLException:
Access denied for user 'root'@'localhost' to database 'my_project'
解决: 给用户授权:
SQL
GRANT ALL PRIVILEGES ON my_project.* TO 'root'@'%';
FLUSH PRIVILEGES;
七、快速排查流程图
TEXT
连接失败
│
├─ MySQL服务启动了吗? ── No → 启动服务
│ Yes ↓
├─ 命令行能连上吗? ── No → 服务有问题,看MySQL日志
│ Yes ↓
├─ 配置文件信息对吗? ── No → 改配置
│ Yes ↓
├─ URL参数对吗? ── No → 加参数(useSSL/timezone/allowPublicKeyRetrieval)
│ Yes ↓
├─ 认证方式兼容吗? ── No → 改mysql_native_password
│ Yes ↓
├─ 端口被占用了吗? ── Yes → 换端口或杀进程
│ No ↓
├─ 防火墙阻止了吗? ── Yes → 添加放行规则
│ No ↓
└─ 还是连不上 → 看MySQL错误日志
查看MySQL错误日志
Shell
# 查看日志位置
mysql -u root -p -e "SHOW VARIABLES LIKE 'log_error'"
# 查看日志文件
# Windows默认位置
# C:\ProgramData\MySQL\MySQL Server 8.0\Data\*.err
或者:
Shell
# 查看错误日志
mysql -u root -p -e "SHOW ERRORS;"
小结
| 排查点 | 检查内容 | 命令 |
|---|---|---|
| 服务是否启动 | MySQL进程是否在 | `net start |
| 连接信息 | URL/用户名/密码/数据库名 | 对照配置文件 |
| 网络防火墙 | 端口是否监听/防火墙是否放行 | `netstat -ano |
| 认证方式 | MySQL 8.x认证兼容性 | ALTER USER ... mysql_native_password |
4个排查点走一遍,95%的数据库连接问题都能解决。