今天迁移服务的时候又踩了一个坑
一个接口在查询数据库的时候报了查不到数据的错误
但是使用同一个 service
的另一个接口在查询的时候却没有问题
于是开启 mybatis
的 debug
模式查看报错接口的 sql
语句
连同参数一起放到数据库中执行,还是查得到数据
百思不得其解
查看一下 mysql
连接的配置参数,确认连接时使用 serverTimezone=Asia/Shanghai
指定了时区
查看了另一个接口的 sql
语句,这才发现了问题所在
时间戳转换后比正常的慢了12个小时,那么就基本确认是时区的问题了
那么接下来就是解决问题了
在项目入口的 main
方法中加入 TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"))
再测试一下
修改后:
修改前:
问题到此基本解决
总结
但是为什么会出现这个问题呢,查询了一下,事实上默认的时区参数是由 JVM
决定的,而 JVM
本身是依靠系统的时区参数来确定内部运行程序默认时区参数的,因此才会出现这个问题
这边我们求证一下,由于没找到 JVM
查看默认时区的参数,因此我使用 jconsole
查看了一下
在命令行输入 jconsole
回车会出现弹窗(此处使用 linux
, windows
用户自行搜索)
我选择的是 Idea
的进程,点开 VM概要
果不其然,时间慢了12小时,但是我本身系统时区设置的就是东八区,查看一下系统时区
想来又是一个大坑,还是暂且绕过,有空再深挖吧