MySQL服务未运行是Java应用连接失败的主因;需验证服务状态、添加8.3.0版mysql-connector-j驱动、配置含时区和SSL参数的JDBC URL,并通过SELECT 1测试真实连通性。
确认 MySQL 服务已正确安装并运行
很多 Java 应用启动时报
或
,根本原因不是代码写错,而是本地根本没跑起来 MySQL。先验证服务状态:
Windows:打开任务管理器 → 服务标签页 → 找到
(或类似名称),确保状态为“正在运行”;也可在命令行执行
mac
OS/Linux:终端运行
(Homebrew 安装)或
通用验证:执行
,能成功登录即说明服务就绪
添加 MySQL JDBC 驱动依赖(Maven)
Java 连 MySQL 必须通过 JDBC 驱动,版本不匹配会导致
或连接后无法执行某些 SQL(如 JSON 字段操作)。推荐使用官方最新稳定版:
注意:
已在 8.0.33 后废弃,新项目必须用
;若用旧版驱动连 MySQL 8+,可能因默认启用 caching_sha2_pass
word
认证而报
错误。
配置 JDBC URL 与连接参数
URL 格式不对是连接失败最常见原因。MySQL 8+ 默认要求显式指定时区和服务器证书策略:
立即学习
“
Java免费学习笔记(深入)
”;
ChatGPT (Windows)
ChatGPT Windows 版本优化了系统兼容性与响应速度,提供多任务处理和对话记录管理功能,适用于办公辅助、创意写作、学习辅导和日常问答。它能帮助用户快速生成文稿、整理资料和高效获取信息,为个人和团队提供稳定、流畅的生产力体验。
下载
基础格式:
若仍报
,说明驱动试图兼容老版本协议,加
生产环境建议启用 SSL:
,并配置信任库
连接池(如 HikariCP)中不要在 URL 里写
—— 现代驱动已弃用该参数,应靠连接池自身的健康检查机制处理断连
测试连接是否真正可用(不只是 DriverManager.getConnection)
只调用
成功不代表数据库就 ready。常见陷阱是连接建立但无法执行查询,比如权限不足或表不存在:
务必加上实际查询(哪怕只是
),否则会掩盖
或
类错误。另外,
对象创建后不自动校验连通性,JDBC 驱动直到第一次执行语句才真正发包到服务端。
本地开发时最容易被忽略的是 MySQL 的 bind-address 配置 —— 如果
里写了
,那
走 socket 连接没问题,但换成
就可能因 DNS 解析或权限规则差异失败。
Communications link failureConnection refusedMySQL80sc query MySQL80brew services list | grep mysqlsudo systemctl status mysqlmysql -u root -pClassNotFoundException
mysql
mysql-connector-j
8.3.0
mysql-connector-javamysql-connector-jPublic Key Retrieval is not allowedjdbc:mysql://localhost:3306/your_db?serverTimezone=Asia/Shanghai&useSSL=falseUnknown system variable 'query_cache_size'&allowPublicKeyRetrieval=true&useSSL=true&requireSSL=trueautoReconnect=trueDriverManager.getConnection(...)try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 1")) {
if (rs.next()) {
System.out.println("✅ 数据库连接与基础查询正常");
}
} catch (SQLException e) {
System.err.println("❌ 连接失败:" + e.getMessage());
}SELECT 1Access denied for userNo database selectedConnectionmy.cnfbind-address = 127.0.0.1localhost127.0.0.1