今天,又遇到 数据库的时间和 界面查询出来的时间,不一致。大概相差14小时的问题。
之前已经解决过1次这个问题了,https://blog.csdn.net/FansUnion/article/details/91387701。
1、所以这次,很快就大概知道 最可能的问题原因了。
2、确认代码,查询数据库 一个sql语句,然后把Map转换成Java 实体类。
最早用jdbc的时候,确认 Map接收,datetime日期 为 自动转换成 java.util.Date 没问题。
再把Map转换成 Java实体类,Date应该没问题。
然后,把date转换成 ymd hms 时间格式。
不太可能是代码问题。
3、看数据库驱动配置,已经用了
oa.jdbc.driver : com.mysql.cj.jdbc.Driver
pom.xml
<!-- mysql -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
4、再次排除可能的代码问题。
同样的sql语句,通过 mysql控制台查询,显示正常。
这次用 字符串,不用java的 date类型。
还是不行。
实在不可能是 java 代码问题。
5、再次确认驱动,发现了问题
spring.datasource.contract.driver-class-name: com.mysql.cj.jdbc.Driver
# oa数据库
oa.jdbc.driver : com.mysql.cj.jdbc.Driver
项目中有2个数据源,oa数据库,这个用的是 最早先的 com.mysql.jdbc.Driver。
这就让人奇怪了。
项目中没有配置 这个5.x的驱动jar包,怎么没有报 ClassNotFound异常呢?
先简单把pom.xml mysql驱动改成5.x,经过测试,时间恢复正常。
再把版本改为8.x的,驱动使用对应的 com.mysql.cj.jdbc.Driver。
测试环境ok。
大喜。
(如果说,时区不带有问题,那为啥之前没有出现呢?之前根本没用过 oa数据库的 时间,这个问题 还没有暴露出来)
6、预发环境部署,又不行了。
测试环境ok,预发环境不ok,不太可能是代码问题,难道是 驱动 有问题,或者 测试和预发 2个环境的数据库不一样?
不可能,测试和 预发,oa数据库 就只有1个。
那,最可能的原因:“控制变量法”。2个环境的 数据库,有哪里配置不一致。
oa.jdbc.driver : com.mysql.cj.jdbc.Driver
oa.jdbc.url : jdbc:mysql://192.11111111:3306/v56?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
预发环境,缺少 服务器 时区参数“serverTimezone=GMT%2B8”。
在最早用mysql 驱动5.x的时候,这个参数不是必须的。
7、结论
现在看来,8.x, jar包用8.x,驱动用 com.mysql.cj.jdbc.Driver,最后 时区 需要带上,我用的是:serverTimezone=GMT%2B8