首页  

mysql查询多次后出现 AEADBadTagException     所属分类 mysql 浏览量 5
mysql   查询几次后出现  
java.sql.SQLException: javax.crypto.AEADBadTagException: Tag mismatch!

MySQL JDBC 连接(尤其 8.0+)在 SSL/TLS 加密传输时,
GCM 认证标签校验失败导致的异常,通常在连接池复用连接、多次查询后出现。

一、核心原因
SSL/TLS 连接状态损坏
连接池中的空闲连接被复用时,底层 SSL 会话已失效、密钥 / IV 不一致或数据被截断,导致 GCM 标签校验失败。
MySQL 8.0+ 默认启用 SSL,旧版驱动(5.x)或配置不兼容,易引发此问题。
驱动 / 服务器版本不匹配
使用 mysql-connector-java 5.x 连接 MySQL 8.0+,或驱动版本(如 8.0.19+)与服务器 TLS 协议(TLSv1.2/1.3)不兼容。
连接池配置缺陷
未开启连接有效性检测(testWhileIdle)、超时设置不合理,导致无效 SSL 连接被复用。
SSL 证书 / 协议问题
服务器证书过期、信任链断裂,或客户端 / 服务器 TLS 版本、加密套件不匹配。


二、快速解决方案(按优先级)
1. 临时关闭 SSL(测试环境)
在 JDBC URL 中添加 useSSL=false,跳过加密:


jdbc:mysql://localhost:3306/db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
生产环境不建议,存在数据传输风险。


2. 升级并匹配驱动版本(推荐)
MySQL 8.0+ 必须使用 mysql-connector-j 8.0.x+(groupId 为 com.mysql,artifactId 为 mysql-connector-j)。
Maven 依赖示例:


<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.33</version> <!-- 选稳定版 -->
</dependency>



清理项目中旧版 mysql-connector-java 5.x,避免冲突。


3. 优化连接池配置(根治复用问题)
以 HikariCP 为例,开启连接有效性检测,避免复用损坏的 SSL 连接:


spring.datasource.hikari.testWhileIdle=true
spring.datasource.hikari.validationQuery=SELECT 1
spring.datasource.hikari.idleTimeout=300000  # 5分钟
spring.datasource.hikari.maxLifetime=1800000 # 30分钟
spring.datasource.hikari.connectionTimeout=30000

Druid 配置:

spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
4. 规范 SSL 配置(生产环境)
显式指定 TLS 版本与加密套件,避免协商失败:

jdbc:mysql://localhost:3306/db?useSSL=true&sslMode=REQUIRED&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
生产环境建议导入服务器 CA 证书到 JVM 信任库,启用完整证书验证。


5. 排查服务器 TLS 配置
查看 MySQL 支持的 TLS 版本:

SHOW VARIABLES LIKE 'tls_version';
确保客户端 enabledTLSProtocols 与服务器支持的版本一致(优先 TLSv1.2+)。


三、排查步骤
确认驱动版本:SELECT VERSION(); 与 mysql-connector-j 版本匹配。
开启 JDBC 调试日志,定位异常连接:

logger.level.com.mysql.cj=DEBUG
检查连接池监控,确认是否为空闲连接复用时触发异常。
临时禁用连接池(直连)测试,若问题消失,说明是连接池复用导致。

上一篇    
不给青春期的孩子讲大道理,给他强者思维

大模型 O1 和 R1 含义

提示词与指令的区别