Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 事故复盘
  3. 正文
                           

【原创】记一次升级MySQL驱动包引发的事故

2021-11-11 2851点热度 0人点赞 1条评论

一

背景

最近项目组在版本迭代时,组件也要进行升级,此时涉及到MySQL驱动包jdbc的版本升级。即从5.1.X升级到8.0.X。

 

然鹅在上线之后就出现了一部分兼容性问题,造成了一次“事故”:调用接口出现“系统错误”。查看日志:java.time.LocalDateTime cannot be cast to java.util.Date,也就是出现时间转换异常。

 

二

问题排查

根据异常堆栈,找到异常抛出的位置:

由此得知,使用mybatis进行SQL的查询时,使用的是Map来接收数据,key是字段名,value则是具体的数据,且为Object,即可接收任何类型的对象数据。异常指出其Object具体为LocalDateTime,而不是Date类型。

 

根据git log知道,老代码基本上没改过,可能的原因就是本次MySQL驱动包的升级,造成的。那么到底是为什么呢?

 

本地环境进行debug跟踪,调整不同的MySQL驱动包mysql-connector-java,发现了最终的原因所在。

 

MySQL 5.1.X版本:

可以看到,MySQL驱动包处理datetime时间类型是使用java.sql.TimeStamp(extends Date)进行构造处理,最后转化为Date类型。

 

调用栈如下:

MySQL 8.0.X版本:

通过MySQL 8.0.X驱动包源码知道,DateTime类型的数据使用的是LocalDateTime,LocalDateTime是Java 8特性的。所以,在新驱动版本中,已经使用上Java 8的相关特性。

 

调用栈如下:

三

MySQL版本

接下来我们来了解下MySQL驱动包对于时间类型DateTime的问题跟踪。

 

3.1 升级的原因及MySQL8.0版本新特性

 

1. 性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载、IO 密集型工作负载、以及高竞争("hot spot"热点竞争问题)工作负载。

 

2. NoSQL:MySQL 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部分功能也得到了更大的改进。该项功能消除了对独立的 NoSQL 文档数据库的需求,而 MySQL 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整的 ACID 合规性。

 

3. 窗口函数(Window Functions):从 MySQL 8.0 开始,新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY。

 

4. 隐藏索引:在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。

 

5. 降序索引:MySQL 8.0 为索引提供按降序方式进行排序的支持,在这种索引中的值也会按降序的方式进行排序。

 

6. 通用表表达式(Common Table Expressions CTE):在复杂的查询中使用嵌入式表时,使用 CTE 使得查询语句更清晰。

 

7. UTF-8 编码:从 MySQL 8 开始,使用 utf8mb4 作为 MySQL 的默认字符集。

 

8. JSON:MySQL 8 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。

 

9. 可靠性:InnoDB 现在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以实现事务完整性了,要么失败回滚,要么成功提交,不至于出现 DDL 时部分成功的问题,此外还支持 crash-safe 特性,元数据存储在单个事务数据字典中。

 

10. 高可用性(High Availability):InnoDB 集群为您的数据库提供集成的原生 HA 解决方案。

 

11. 安全性:对 OpenSSL 的改进、新的默认身份验证、SQL 角色、密码强度、授权。

 

3.2 MySQL 驱动8.0.X版本对DateTime的变更

 

Also, with the implementation of the new mechanism, a getObject(columnIndex) call on a DATETIME column returns a LocalDateTime object now instead of a String. To receive a String like before, use getObject(columnIndex, String.class) instead.

官方8.0.23版本变更日志

由此可见,针对DateTime类型的字段,在8.0.23的版本做了调整,直接返回(jdk8)LocalDateTime类型。

 

3.3 MySQL 驱动版本和Java版本的对应关系

 

从上面知道,MySQL 驱动包jdbc分成两个分支版本5.1和8.0,并且8.0版本是作为首选的推荐版本。

四

总结

1)做作何组件版本的升级,都要注意风险,要慎重对待。新版本虽然好用,但是兼容性问题都要尽量处理好,以免造成生产事故。

 

2)MySQL驱动包jdbc新版本8.0支持了很多特性,但是要能了解到跟旧版本的区别及其调整了哪些内容,以及存在的兼容问题,都要一清二楚,可以罗列清单,将相关可能存在的问题考虑周全,对相关功能进行回归测试,这样就可以比较好的平稳升级。

 

 

〖参考资料〗

 

1、MySQL和MySQL驱动mysql-connector-java升级到8.0.X版本

https://blog.csdn.net/AOBO516/article/details/93370637

2、Changes in MySQL Connector/J 8.0.23 (2021-01-18, General Availability)

https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-23.html

 

3、Chapter 2 Connector/J Versions, and the MySQL and Java Versions They Require

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-versions.html

回复公众号【资料】获得干货资料集锦:技术ppt、IT大会资料、架构、分布式资料等。
推荐好文
1、互联网Code Review最佳实践分享
2、dubbo面试题!会这些,说明你看懂了dubbo源码
3、Kafka面试题!掌握它才说明你真正懂Kafka
4、
Netty 5.0为啥被舍弃?原因竟然是...
5、
中台之上——业务架构系列【汇总】
6、必备瑞士军刀IDEA插件,你使用了哪些
7、线上热更新代码只需3步 Arthas实战
8、Eureka源码剖析之七:架构&面试题【总结】
9、互联网工程师应该用这种姿势打印日志

-关注搬运工来架构,与优秀的你一同进步-

如果喜欢这篇文章可以点在看哦

更多文章:

  1. mysql-connect-java驱动从5.x升级到8.x的CST时区问题
  2. 全链路压测之影子库及ShardingSphere实现影子库源码剖析
  3. 系统设计 | 如何表达迭代技术方案?(战术篇)
  4. 系统设计 | 哪些技术标准可以帮助系统设计?
  5. Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
  6. MySQL事务死锁问题排查
  7. 系统设计 | 高精度计算
  8. 一次磁盘占用率 100% 的排查记录
  9. 分布式事务场景、概念和方案整理(含概念图)
  10. MySQL8.0驱动升级事故——之三
标签: 原创 线上事故 组件升级 MySQL
最后更新:2023-02-19

Cocodroid

专注Java后端,分享技术。

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • 秋天0261

    最近遇到没指定时区,造成生产数据时间快了13小时,一定要注意啊!

    2023-05-13
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    广告
    最新 热点 推荐
    最新 热点 推荐
    视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink?
    Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?
    笔记 | 面试官问我:TCP与UDP的区别 理解DDD之限界上下文和核心域、支撑域、通用域 2021.07.13 我们是这样崩的 JVM 内存分析神器 MAT: Incoming Vs Outgoing References 你真的了解吗? 预测 2025 AI 浅析设计模式2 —— 策略模式 从滴滴的故障我们能学到什么 笔记 | 面试官问我高并发的问题:并发编程的三大挑战

    CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (19) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

    推荐链接🔗
    • AI工具集
    • 工具箱🛠️

    COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    粤ICP备15033072号-2

    x