SpringBoot 3 Webflux R2DBC MySQL时区异常问题求助
解决Spring Boot Webflux + R2DBC MySQL时区异常问题
问题根源
MySQL服务器返回的时区是Eastern Daylight Time,这是夏令时的显示名称,而非Java ZoneId能识别的标准区域ID格式(标准格式为Continent/City,比如America/New_York)。R2DBC MySQL驱动尝试将该名称转换为Java时区时,触发DateTimeException警告。
解决方案
方案1:修改MySQL服务器时区配置(推荐)
让MySQL返回标准的区域ID,从根源解决问题:
- 临时生效:登录MySQL执行以下命令,重启应用连接后生效:
SET GLOBAL time_zone = 'America/New_York'; SET time_zone = 'America/New_York'; - 永久生效:修改MySQL配置文件(Linux为
my.cnf,Windows为my.ini),添加/修改:
保存后重启MySQL服务。[mysqld] default-time-zone = 'America/New_York'
方案2:修改R2DBC连接URL(无需修改MySQL配置)
在URL中强制指定时区,并关闭服务器时区检测,避免驱动尝试解析服务器返回的无效时区名称:
修改application.yml中的R2DBC URL,添加timeZone=America/New_York和useServerTimezone=false参数:
spring: r2dbc: url: r2dbc:mysql://localhost:3306/testdb?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=America/New_York&timeZone=America/New_York&useServerTimezone=false username: root password: root webflux: problemdetails: enabled: true
注:该参数对
io.asyncer.r2dbc.mysql和dev.miku:r2dbc-mysql两个驱动均适用。
方案3:禁用驱动的时区警告(仅消除警告,不解决根源)
如果只是想消除警告,可在日志配置中过滤该警告信息,比如logback.xml添加:
<logger name="io.asyncer.r2dbc.mysql.MySqlConnection" level="ERROR"/> <logger name="dev.miku.r2dbc.mysql.MySqlConnection" level="ERROR"/>
但不推荐此方案,因为时区不匹配可能导致时间数据读写错误。
验证
修改完成后,重启应用,检查日志是否不再出现时区相关警告,同时验证时间数据的读写是否正确。
内容的提问来源于stack exchange,提问作者Shakthi
相关产品推荐
相关产品推荐

