排查系统执行SQL与数据库直接执行结果不一致的问题
现象
- 系统根据指定的日期范围(LocalDateTime)查询数据库,结果与直接将SQL语句查询不一致,系统查询的并不是期望日期范围的数据。
- 通过 LocalDateTime、LocaDate、LocalDate 作为时间插入数据时,时间不对
解决
更换 mysql 的驱动包版本在 8.0.22及以上
官网bug说明:https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-22.html
注意:考虑到规范问题,8.0.31的时候驱动包的坐标调整了!!!
8.0.31 之前maven坐标 | 8.0.31 及以后maven坐标 |
---|---|
groupId: mysql artifactId: mysql-connector-java |
groupId: com.mysql artifactId: mysql-connector-j |
过程
-
上线之后,通过定时任务生成的报表数据有很明显的异常,用户报故
-
在本地环境进行 debug 时,发现查询出来的结果列表和期望值不一样
-
开启了 mybatis 的sql日志打印,将日志打印在控制台,将其拿到数据库执行,结果与应用查询得到的数据量不同
-
怀疑过是 LocalDateTime 转换问题、MP问题、应用时区问题,debug 证明不是
-
祭出度娘,找到了 https://www.cnblogs.com/ingxx/p/13476718.html,进而定位到了是数据库驱动问题
-
原文说的是8.0以上都有时区问题,之后就是各种测试,发现并不是所有8以上版本都有问题,然后就是二分法找到没有此问题的版本(8.0.22)
-
之后官网找到了bug修复说明 https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-22.html
结论
一切的源头都是因为我将 springboot 从 2.5.8 升级为了 2.7.8,并且在mysql驱动8.0.31的时候考虑到规范问题,修改了坐标!!!
在 spring-boot-dependencies 2.5.8 的时候,依赖的mysql驱动包版本为 8.0.27,在 2.7.8 的时候,依赖的mysql驱动包版本为 8.0.32;
升级之后,编译的时候出现如下错误:
所以就很简单的增加了一个版本
正确的做法应该是删除旧的仓库坐标,添加新的驱动坐标:
<!-- 版本号已由 springboot 自动配置 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
万事有因,当问题排查出来并且解决的时候,是真的舒服~
相关文章
- 从本体论开始说起——运营商关系图谱的构建及应用
- 如何成为一名数据科学家?
- 从未见过的堂兄杀了人,你的DNA是关键证据
- 20个安全可靠的免费数据源,各领域数据任你挑
- 20个安全可靠的免费数据源,各领域数据任你挑
- 阿里云李飞飞:All in Cloud时代,云原生数据库优势明显
- 基于Hadoop生态系统的一高性能数据存储格式CarbonData(性能篇)
- 大数据告诉你:10年漫威,到底有多少角色
- TigerGraph:实时图数据库助力金融风控升级
- Splunk利用Splunk Connected Experiences和Splunk Business Flow 扩大数据访问
- 大数据开发常见的9种数据分析手段
- 以免在景区看人,我爬了5W条全国景点门票数据...
- 【实战解析】基于HBase的大数据存储在京东的应用场景
- 数据科学家告诉你哪些计算机科学书籍是你应该看的
- Kafka作为大数据的核心技术,你了解多少?
- Spring Boot 整合 Redis 实现缓存操作
- 大数据学习必须掌握的五大核心技术有哪些?
- 基于Antlr在Apache Flink中实现监控规则DSL化的探索实践
- 甲骨文再次被Gartner评为分析型数据管理解决方案魔力象限领导者
- 爬取吴亦凡微博102118条转发数据,扒一扒流量的真假