【原创】升级需谨慎,开发两行泪!——记一次MySQL驱动包升级引发的事故

news2024/9/28 19:17:35

一、背景

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

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

另外使用jFinal进行数据库连接处理。

二、问题排查

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

由此得知,使用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.

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

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

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

四、总结

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

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

五、解决办法

1、在jFinal中的class:RecordBuilder增加日期转换,兼容timestamp格式,如下图所示:

  1. 在jFinal中修改获取日期代码,增加日期类型转换和判断:

参考资料:

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

blog.csdn.net/AOBO516/art…

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

dev.mysql.com/doc/relnote…

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

dev.mysql.com/doc/connect…

4、简书故障处理:https://juejin.cn/post/7021543058579832840

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C. Least Prefix Sum(可以后悔的拿取+multiset)

Problem - C - Codeforces 波罗的海,一个著名的棋手,同时也是一个数学家,他有一个数组a1,a2,...,an,他可以进行以下几次(可能是0次)操作。 选择某个索引i(1≤i≤n)。 将ai与-1相乘&…

Ffmpeg中AVFrame数据保存成YUV--讨论AVFrame的linesize

目录 YUV播放器 AVFrame中保存成YUV实现 linesize的意义 实测(PC机-64bits-win10) 总结: YUV播放器 首先要有一个YUVplayer用来播放测试的YUV数据,雷神改良过的YUV播放器: 修改了一个YUV/RGB播放器_雷霄骅的博客-CSDN博客 播放器播放界…

查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

如题所示,这个问题是我在postgresql中使用pg_dump备份多个schema的表时遇到的问题。bin\pg_dump --dbnamepostgresql://dbuser:123456localhost:5432/test --table public.xx_user --table test.xx_test -f d:\tools\pgsql\dump.sql pg_dump: 错误: 查询失败: 閿欒…

react生命周期(类组件/函数组件)

1.react代码模式分为两种 类组件和函数组件(生命周期也有所不同) 2.类组件(写法如下) import React from react export default class App1 extends React.Component{state {username:,password:}setUser (event) > {this.s…

《MySQL系列-InnoDB引擎12》启动、关闭与恢复

启动、关闭与恢复 InnoDB是MySQL数据库得存储引擎之一,因此InnoDB存储引擎得启动和关闭,可以说是MySQL实例得启动过程中对InnoDB存储引擎的处理过程。 在关闭时,参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。该参数可取值为0、…

BIOS(控制权交接第一棒)

计算机系统的控制权(CPU的使用权)交接的第一棒是BIOS!接下来,我们简单学习一下BIOS相关知识。 在计算机接电后按下开机键,首先运行的软件是基本输入输出系统(Basic Input Output System,BIOS&a…

阿里云故障有感

2304阿里云故障有感 为什么会写一个如此奇怪的议题。 人的生活轨迹,不一定只有唯一的叙事方式,可以不那么苦,不那么累,不那么怕,不那么憋屈。 不再去追求宏大的叙事,而是去关心自己的感受,吃没…

Spring Boot学习篇(六)

Spring Boot学习篇(六) mybatis-plus使用篇(二) 1 新增 1.1 示例代码 AutowiredISongsService songsService; Testpublic void add(){Songs snew Songs(null,"11","xx",null,"xx歌曲","2020-02-12");songsService.save(s);System.…

linux之vim编辑器

文章目录1. 概念2.安装3. vim的使用1.使用一些按键没有反应2. 模式转换1.命令模式转换到插入模式1. a2. i3. o2.命令模式切换到底行模式1. 退出3. 整体概念图4. 热键的使用1. 命令模式下1.复制——yy 粘贴——p复制若干行—— n yy粘贴若干行—— n p2. 撤销操作——u3. 对撤销…

03-Alibaba微服务组件Nacos注册中心实战

什么是 Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 的关键特性包括: 服务发现和服务健康监测 动态配置服务 动态 DNS 服务 服务及其元数据管理 Nacos…

陆道培医疗冲刺香港上市:持续亏损,毛利率下滑,陆佩华为董事长

2023年1月3日,陆道培医疗集团(下称“陆道培医疗”)在港交所递交招股书,准备在港交所主板上市。本次冲刺上市,陆道培医疗拟将募资金额用于河北燕达陆道培医院的扩建及搬迁及上海陆道培医院的开业等。 同时,陆…

新生儿只是睡?了解了他的生长发育情况后就不这么觉得了

在网上看到这样一句话,说:所谓坐月子,其实就是把最需要照顾的产妇和新生儿捆在一起,让他们互相治愈。是的,在很多人眼里,新生儿除了吃饭就是睡觉,照顾起来真的很容易,但是只要了解了新生儿的生长…

Android开发常见问题:为什么不要用Timer?

前言 从刚开始做Android开始,就时刻谨记一条规则:如果有能实现功能的Android API,就不要用Java API。所以我很少用Timer,直到前一阵一个朋友问我: 我有一个Timer计时器,我看logcat已经启动了,为…

嵌入式应该从哪里入手?

就从目前IT行业大的方向上来讲嵌入式工程师相对来讲是非常吃香的,学习嵌入式开发的朋友数量也是非常的多的,那么对于对嵌入式工程师我们应该从哪里入手呢? 下面就根据我自身多年的一个实际的工作经验来给哪些不知道怎么入门的朋友来简单的介绍一下。 前…

C语言进阶——指针(一)

目录 一. 字符指针 二. 指针数组 三. 数组指针 四. 数组参数、指针参数 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 一. 字符指针 在之前,我们就了解到过字符指针 int main() {char aW;//字符变量char* pa&a;//字符指针*…

1.3日报

今天优化了getMobileByScene接口, 测试accountadd接口 遇到的问题与解决 在升级安装python3时,由于操作失误,导致系统错误,在同事帮助下重装了系统,好在保住了文件。但是软件还得重新配置。 getMobileByScene接口在…

精益|什么是价值流图分析(VSM)?

在精益生产管理中,价值流研究主要是指利用制作价值流图,进行价值流图研究可以发现并消除浪费、降低成本,改进企业运营状况,提升企业竞争力。因此进行价值流研究离不开价值流图。 价值流图(Value Stream Mapping&#x…

基于KT6368A蓝牙芯片开发智能抖音翻页翻页笔总结

一、功能简介 KT6368A蓝牙芯片也是基于 HID 开发,主要用于浏览当下火爆的抖音等小视频的上下翻页、左右菜单切换、暂停等操作。打开手机蓝牙进行连接,进入视频浏览界面操作对应按键即可。包含一个蓝牙的指示灯,表示是否连接 。同时支持adkey按…

HBase面试题汇总

1、请描述HBse的? 答: Memstore级别:当MemStore的大小达到设置阈值(默认128M),会触发flush操作。 1、HBase中Memstore在何时进行数据的flush操作? 答: Memstore级别&#xff1a…

uniapp 填坑之旅---udb微信小程序端显示异常

功能描述:A页面展示列表a,点击a,进入B页面,展示a对象关联的子对象b。在B页面中,通过unicloud-db组件manual模式加载,具体代码按照官网示例来写。问题描述:代码实现后,一直在H5调试&a…