坑位1:连接重置,一秒回到解放前
症状:应用启动时抛出 Communications link failure 异常,日志显示“last packet sent … was 0 ms ago”。
原因:MySQL 8默认启用更严格的连接检测机制,若网络波动或长时间空闲,会自动断开连接。
解决方案:
# 在application.properties中添加超时配置
spring.datasource.hikari.connection-timeout=30000 # 连接超时(毫秒)
spring.datasource.hikari.idle-timeout=600000 # 空闲连接超时
spring.datasource.hikari.max-lifetime=1800000 # 连接最大存活时间
坑位2:公钥检索被拒,密码加密惹的祸
症状:Public Key Retrieval is not allowed 异常,应用无法连接数据库。
原因:MySQL 8默认使用 caching_sha2_password 认证插件,该插件需通过RSA加密传输密码。但JDBC驱动出于安全考虑,默认禁止主动获取公钥。
解决方案:
# 方法1:临时解决方案(开发环境)
spring.datasource.url=jdbc:mysql://localhost:3306/dbname?allowPublicKeyRetrieval=true
# 方法2:永久解决方案(生产环境)
# 1. 登录MySQL
ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
# 2. 重启MySQL服务
坑位3:默认认证插件变了,密码失效?
症状:原密码突然失效,报 Access denied。
原因:MySQL 8将默认认证插件从 mysql_native_password 改为 caching_sha2_password,旧密码格式不再兼容。
解决方案:
-- 为用户设置新密码(使用新插件)
ALTER USER 'username'@'localhost' IDENTIFIED BY 'NEW_PASSWORD';
-- 或回滚到旧插件
ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'OLD_PASSWORD';
坑位4:时区陷阱,日期计算全乱套
症状:日期字段显示异常,如 2023-01-01 08:00:00 变成 2023-01-01 00:00:00。
原因:MySQL 8默认时区设置为 SYSTEM,与应用服务器时区不一致。
解决方案:
# 显式设置时区
spring.datasource.url=jdbc:mysql://localhost:3306/dbname?serverTimezone=Asia/Shanghai
坑位5:JSON函数缺失,NoSQL体验泡汤
症状:调用 JSON_OBJECT() 等函数时报错 Unknown function。
原因:MySQL 8默认禁用JSON函数(出于性能考虑)。
解决方案:
-- 开启JSON支持
SET GLOBAL log_bin_trust_function_creators = 1;
INSTALL PLUGIN soname 'lib_mysqludf_json.so';

被折叠的 条评论
为什么被折叠?



