上周团队决定将老项目的MySQL驱动从5.1升级到8.0版本,本以为只是改个版本号的小事,没想到部署后立即出现大量"Could not create connection to database server"的报错。这让我意识到,数据库驱动的升级远不止修改pom.xml那么简单。经过三天的问题排查和修复,我整理出这份覆盖全场景的升级指南。
MySQL Connector/J 8.0相比5.x系列引入了多项重大变更,这些变化直接影响连接建立机制:
5.x驱动会隐式使用服务器时区,而8.0版本则强制要求显式指定。这是最常见的报错根源:
java复制// 典型错误配置
jdbc:mysql://localhost:3306/mydb?useSSL=false
// 正确配置(必须包含时区)
jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai
时区参数推荐值:
| 场景 | 推荐值 | 备注 |
|---|---|---|
| 国内项目 | Asia/Shanghai | 北京时间 |
| 国际项目 | UTC | 协调世界时 |
| 兼容旧系统 | GMT | 需测试验证 |
8.0版本默认启用SSL连接,这在没有配置证书的开发环境会导致连接失败:
properties复制# 开发环境可临时禁用(生产环境不推荐)
useSSL=false
allowPublicKeyRetrieval=true
注意:allowPublicKeyRetrieval=true存在安全风险,仅作为过渡方案使用
MySQL 8.0默认使用caching_sha2_password插件,而旧版驱动仅支持mysql_native_password:
sql复制-- 检查用户认证插件
SELECT user,host,plugin FROM mysql.user;
-- 修改认证方式(兼容方案)
ALTER USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
必须包含的关键参数:
java复制jdbc:mysql://host:port/dbname?
useSSL=false&
serverTimezone=Asia/Shanghai&
characterEncoding=utf8&
autoReconnect=true&
allowPublicKeyRetrieval=true
参数组合策略:
Maven配置示例:
xml复制<!-- 正确声明依赖范围 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
<scope>runtime</scope>
</dependency>
常见版本兼容问题:
以HikariCP为例的适配配置:
yaml复制spring:
datasource:
hikari:
connection-init-sql: SET time_zone = '+8:00'
connection-test-query: SELECT 1
maximum-pool-size: 20
提示:不同连接池对8.0驱动的适配方式不同,需查阅具体文档
在pom.xml中建立版本切换开关:
xml复制<profiles>
<profile>
<id>mysql-5</id>
<properties>
<mysql.version>5.1.49</mysql.version>
</properties>
</profile>
<profile>
<id>mysql-8</id>
<properties>
<mysql.version>8.0.28</mysql.version>
</properties>
</profile>
</profiles>
分阶段执行:
必须准备的应急措施:
mermaid复制graph TD
A[连接失败] --> B{错误信息}
B -->|SSL相关| C[检查useSSL参数]
B -->|时区相关| D[添加serverTimezone]
B -->|认证失败| E[修改用户插件]
B -->|驱动不兼容| F[降级或升级驱动]
| 错误代码 | 原因 | 解决方案 |
|---|---|---|
| 08001 | 连接初始化失败 | 检查基础网络和权限 |
| 08004 | 服务器拒绝连接 | 验证认证插件和密码 |
| 22001 | 时区配置异常 | 添加serverTimezone参数 |
| 0A000 | SSL握手失败 | 配置证书或临时禁用SSL |
升级后的监控重点:
在某金融项目中的实施经验:
特别提醒:使用MyBatis的项目需要检查所有包含日期操作的SQL语句,8.0驱动对时间类型的处理更为严格。我们在升级后发现三个历史SQL需要重写,主要问题是隐式的时区转换。