mysql JDBC连接失败怎么办_mysql常见问题排查

来源:这里教程网 时间:2026-02-28 20:43:24 作者:

MySQL JDBC 连接失败,90% 的情况不是代码写错了,而是连接前的环境链断了一环——服务、网络、权限、驱动、时区,五个环节只要一个没对上,

SQLException
就立刻报给你看。

检查 MySQL 服务和端口是否真在监听

别信“我刚装完肯定开着”,很多新手在 Docker、Homebrew 或 Windows 服务里装了 MySQL,但压根没启动,或者启了却监听在

127.0.0.1
而非
0.0.0.0
,导致远程 JDBC 连不上。

Linux/macOS:运行
sudo lsof -i :3306
netstat -tuln | grep :3306
,确认有
LISTEN
状态进程
Windows:用
netstat -ano | findstr :3306
,再用任务管理器查 PID 对应进程
如果没输出,说明 MySQL 没运行;如果有但只绑定
127.0.0.1:3306
,需改
my.cnf
(Linux/macOS)或
my.ini
(Windows)里的
bind-address
行,注释掉或改成
0.0.0.0

验证 JDBC URL 和关键参数是否完整且兼容

JDBC URL 看似简单,但 MySQL 8+ 和旧版驱动对参数极其敏感。漏掉

serverTimezone
或乱用
useSSL
,连
DriverManager.getConnection()
都进不去就会抛异常。

必须带的参数(MySQL 8.0+ 推荐):
useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
serverTimezone=UTC
虽能过,但在中国存时间会偏移 8 小时;
GMT%2B8
是 URL 编码写法,不如直接写
Asia/Shanghai
如果用的是 MySQL 5.7 及更早版本 +
mysql-connector-java:5.1.x
,驱动类名是
com.mysql.jdbc.Driver
;MySQL 8+ 必须用
com.mysql.cj.jdbc.Driver
,否则抛
ClassNotFoundException
URL 示例(请复制后替换 host/port/db):
jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8

排查用户权限和远程访问限制

即使密码对、URL 对、服务开着,MySQL 默认只允许

root@localhost
登录。JDBC 从本机 IDE 或远程服务器连进来,host 往往是
127.0.0.1
或具体 IP,权限不匹配就直接拒绝。

登录 MySQL 命令行(用 root 本地登录):
mysql -u root -p
执行:
SELECT host, user FROM mysql.user;
看你用的用户名(比如
'appuser'
)是否允许从目标 host 连接
若只看到
localhost
,需授权:
GRANT ALL PRIVILEGES ON *.* TO 'appuser'@'%' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;
%
表示任意 host,生产环境建议限定 IP)
注意:Windows 下某些 MySQL 安装默认禁用
%
用户,需检查
skip-networking
是否被启用

抓取真实错误堆栈,别只看第一行

很多人只扫一眼控制台最上面的 “Connection refused” 或 “Access denied”,就去改密码或重装驱动,结果浪费两小时。真正线索藏在完整堆栈里。

务必在
catch (SQLException e)
中打印完整信息:
e.printStackTrace();
不要用
e.getMessage()
—— 它常被截断
典型线索举例:
• 出现
Unknown system variable 'query_cache_size'
→ 驱动版本太高(如 8.0.33 连 MySQL 5.6),降级到
5.1.49
或换低版本驱动
• 报
Client does not support authentication protocol
→ MySQL 8 默认用
caching_sha2_password
插件,客户端不支持,需执行
ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';

• 提示
Communications link failure
且无具体原因 → 先 ping、再 telnet 端口,99% 是防火墙或网络不通

最常被跳过的其实是日志:MySQL 的

hostname.err
日志(通常在
/var/lib/mysql/
C:\ProgramData\MySQL\MySQL Server X.X\Data\
)里,会明确写 “Access denied for user 'xxx'@'yyy' (using password: YES)” 或 “Too many connections”,比 Java 异常更接近真相。

相关推荐