遇到一个问题,线下环境测试数据的查询完全没有问题,但是线上环境却没法查询出数据,并且从mybatis
输出的日志来看,查询参数也没有问题,数据库中数据也是存在的,查询参数类型是java.util.Date
。
而且mybatis
还很迷的输出了这么一句Total: 1
,这行日志是在对mybatis
开启DEBUG
才会输出的
于是,想破了头,一心想着是不是mybatis
在查询结果后,从查询结果集到实体类的映射出了什么问题?
但是又很怀疑,因为并没有任何异常抛出来
期间想到要不用下BTrace,后来还是决定把mybatis
源码过一遍看看,毕竟,即便使用BTrace
,也要知道从哪里入手来排查
吭呲吭呲的啃了一天多,mybatis
太缺少注释,看起来是真的难
找到了没有查到结果但是日志又输出
Total: 1
的原因,给mybatis提了个Issue
最后发现从代码看不出问题(主要还是不精)
最后还是指望BTrace
这些玩意了
然后看到说阿里的Arthas比较好用些,最后就用了下,挺不错的
然后最后跟踪的结果就是,实际查询时使用的时间和我程序计算的时间不一样,小了十三个小时,我就猜到可能是这个原因了
最后给JdbcURL加上了serverTimezone=Aisa/Shanghai
,问题解决了
这里要说的是,如果你使用的MySQL JDBC Driver
版本在8.0
及以上,一定要设置这个
一般来说,如果MySQL
服务器设置了时区信息,应该是没问题的
show variables like ‘%time_zone%‘; 这样来查看MySQL服务器设置的时区信息
不过如果没有设置,就可能出现不同的环境,产生这种不易发现的问题。