MySQL版本5.7.99?

news2024/12/23 19:43:06

序:在项目工作中需要从三方厂商数据库同步数据到项目业务库中,本平平无奇的功能却被一个报错打破。

  在使用某框架的DataSourceConfig(Object)方法初始化数据库连接时,日志输出报错:

    Unknown system variable 'transaction_isolation'

  经过网上查找相关资料,发现问题现象大同小异都是连接驱动与数据库版本不匹配。从 MySql-5.7.20 版本后 transaction_isolation 作为 tx_isolation 的别名被引入,而在mysql-8.0之后的版本tx_isolation参数被彻底废弃。给出的解决方案无非就是:1.升级数据库的版本。2.降低MySQL连接驱动的版本。

  方法1:升级数据库版本

  数据库为三方厂商的生产数据库,让他们升级数据库版本似乎不太可能。

  方法2:降低MySQL连接驱动版本

  要降低连接驱动版本,首先要确定三方厂商的数据库版本,在查询他们的数据库版本时,令人窒息的事情发生了,查询出他们的数据库版本为MySQL-5.7.99。

  What?,在MySQL-5.7.20版本后,不是已经有transaction_isolation参数了吗?而且用 show variables like 't%_isolation'; 语句在三方库查询,确实没有transaction_isolation这个系统参数。下表是使用同一语句在三方数据库库和我们数据库查询结果。

表1

 三方数据库 我方数据库
show variables like 't%_isolation'; 
show variables like 't%_read_only';
select version();

  可以看到我方查询事务隔离级别的语句是包含transaction_isolation和tx_isolation系统参数,而三方库只有tx_isolation这一个。没办法只能更换驱动包试试,找到MySQL-5.7.20版本适配的驱动包版本是mysql-connector-java-5.1.12,替换系统中的jar包后重启业务应用,结果在启动过程中因为不适配低版本的驱动包导致启动报错。立即更换其他稍微高点版本的驱动,虽然启动没报错了,但是三方的数据库在连接时依然报出Unknown system variable 'transaction_isolation'这个错误。看来更换连接驱动这个办法也行不通。

  没办法只能先看看mysql-connector-java驱动的源码,看能不能从源码中找到问题。连接驱动版本为5.1.48。先从报错日志打印的错误堆栈信息入手。

 

图1

  好在方法调用层级不算多,众所周知java方法调用信息使用“栈”结构进行存储,栈弹出逻辑为即“先进后出”,那么最下面的方法就是要排查的起点。从ConnectionImpl.connectWithRetries()方法依次为ConnectionImpl.initializePropsFromServer()、ConnectionImpl.loadServerVariables() ...... 进行查看。

  首先看 ConnectionImpl.connectWithRetries()方法,此方法做了些参数初始化后调用了initializePropsFromServer()方法:

图2

  在initializePropsFromServer()方法中也是初始化参数后调用了loadServerVariables()方法,进入到loadServerVariables()方法后发现了问题的关键。

图3

 其中有行判断数据库版本后,选择在查询系统参数的sql中拼接 @@tx_isolation AS transaction_isolation 还是拼接 @@transaction_isolation AS transaction_isolation语句,而三方库数据库版本为MySQL-5.7.99,不满足条件则拼接的查询语句为 @@transaction_isolation AS transaction_isolation 从而引起报错。查看连接驱动版本大于5.1.48的的源码判断逻辑也是如此,那么就排除是连接驱动jar包bug的问题。可以确定问题就出在了这个不按常理出牌的三方数据库身上。当时正值深夜,而且三方数据库已投入生产使用,也不可能让厂商处理数据库问题,那么就只能看看能不能修改源码规避掉这个问题。

图4 在三方数据库执行查询语句

 

  我方数据库版本也是使用transaction_isolation参数来查询事务隔离级别,但是通过前期的排查,发现同时存在tx_isolation这个系统参数(详见表1)。那么把queryBuf.append(", @@transaction_isolation AS transaction_isolation"); 改为 queryBuf.append(", @@tx_isolation AS transaction_isolation");,不仅可以规避掉三方数据库没有transaction_isolation参数的问题,而且也不会对我们的数据库造成影响。只需要下载源码修改后再编译为jar包就可以了。

  从github(https://github.com/mysql/mysql-connector-j/blob/5.1.48/src)上找到5.1.48版本的源码后导入工程,修改完成后发现并不能直接编译,因为还引用了hibernate,而源码中也没找到关于其他依赖引用的描述,依赖问题一时半会也解决不了,那么就直接修改编译后的class字节码文件吧。

  把mysql-connector-java-5.1.48.jar中的ConnectionImpl.class文件提取出来,使用jclasslib工具打开,在“方法”中搜索 loadServerVariables,在字节码文件中找到拼接“, @@transaction_isolation AS transaction_isolation”对于的行,点击行中间的常量地址跳转到常量池,在常量池把值修改为“, @@tx_isolation AS  transaction_isolation”后保存,把修改后文件放回jar包中。

  

图5

  jar包调整完成后更新应用,发现连接三方库还是有报错,但从这次的异常日志中发现报错的方法变了,原来在getTransactionIsolation()方法中也需要把transaction_isolation改为tx_isolation。还是用上面的方法修改后再更新应用。

图6

  再次更新后发现又报Unknown system variable 'transaction_read_only'的错误,看来之前的修改是有效果的。transaction_read_only和transaction_isolation一样,都是在MySQL-5.7.20版本后加进去的,而三方数据库只有tx_read_only这个系统参数,我们的数据库既有transaction_read_only又有tx_read_only,还是可以使用上面的方法进行调整。根据报错调整isReadOnly()方法,调整完成更新后,再次连接三方数据库,可正常连接,同时业务应用没有因为驱动调整而产生报错和异常。

 

 图7

  事后在MySQL官网查询,并没有发现又5.7.99的版本,那么友商5.7.99这个版本的数据库到底从何而来?为何数据库会缺少系统参数?至今仍是个迷......

图8

完......

 

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

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

相关文章

sparkRDD编程实战

文章目录 sparkRDD编程实战1、Spark RDD 实现单词计数2、Spark RDD 实现分组求TopN3、Spark RDD 实现二次排序4、Spark RDD 计算平均成绩5、Spark RDD 倒排索引统计每日新增用户6、Spark案例实操7、Spark RDD 综合应用需求1:Top10热门品类需求说明实现方案一实现方案…

【Python SMTP/POP3/IMAP】零基础也能轻松掌握的学习路线与参考资料

Python是一种高级编程语言,广泛应用于Web开发、人工智能、数据科学、自动化等领域。SMTP/POP3/IMAP是与邮件相关的三个协议,分别用于发送邮件、接收邮件和访问邮件。使用Python可以轻松实现这些功能,本文将介绍Python SMTP/POP3/IMAP的学习路…

【Python】Python系列教程-- Python3 条件控制(十六)

文章目录 前言if 语句if 嵌套match...case 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二)Python系列教程–Python3 VScode(三)Python系列教程–Pytho…

Spring Boot整合Swagger2 Swagger2配置

目录 什么是Swagger? Swagger如何使用 如何使用Swagger 查看SwaggerAPI文档 什么是Swagger? Swagger是一款流行的RESTful API文档生成工具,它支持多种编程语言和多种框架,包括但不限于Java、Python、Node.js、Go等,Spring Boot也提供了…

【机器学习】第二章:K近邻(分类)

系列文章目录 第二章:K近邻(分类) 相关代码地址:https://github.com/wzybmw888/MachineLearning.git 文章目录 系列文章目录一、最近邻算法二、最近邻算法的缺陷(1)策略一:K近邻(k‐…

java源码为什么需要编译成字节码?

作用1: jvm支持多语言,需要字节码作为统一的规范 作用2: 字节码转成机器的指令会更快 作用3: 如果没有对应的反编译器,字节码还具有一定的安全保密作用

【Rust日报】2023-06-02 Rust 1.70.0 稳定版发布

Rust 1.70.0 稳定版发布 Rust 团队很高兴地宣布 Rust 的新版本 1.70.0。Rust 是一种编程语言,它使每个人都能构建可靠、高效的软件。 最大的特性是,OnceCell稳定版可用啦。 如果你通过 rustup 安装了以前版本的 Rust,你可以通过以下方式获得 …

Linux 之大数据定制篇-Shell 编程

Linux 之大数据定制篇-Shell 编程 为什么要学习Shell 编程 Linux 运维工程师在进行服务器集群管理时,需要编写Shell 程序来进行服务器管理。对于JavaEE 和Python 程序员来说,工作的需要,你的老大会要求你编写一些Shell 脚本进行程序或者是服…

Mocha AE:图层相关面板

Mocha AE 左侧的图层面板、图层属性面板以及边缘属性面板提供了与图层、样条、跟踪等相关的选项。 Layers 图层 图层的上下顺序相当重要。 上方所有图层的样条区域将被自动排除出跟踪遮罩 Track Mattes。 也可在同一图层上绘制多个样条形状。相交的样条区域将被排除出遮罩。 Vi…

【MySQL】一文带你了解MySQL中的子查询

文章目录 1. 需求分析与问题解决1. 1实际问题1.2 子查询的基本使用1.3 子查询的分类 2. 单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING 中的子查询2.4 注意的问题 3. 多行子查询3.1 多行比较操作符3.2 代码示例 4. 相关子查询4.1 相关子查询执行流程4.2 代码示例 子查询…

图论学习(六)

图的连通度 删去任意一条边后便不连通 删去任意一条边后仍连通,但删去点u后不连通。 G3和G4删去任意一条边或任意一个点后仍连通,但从直观上看,G4的连通程度比G3高。 割边 设e是图G的一条边,若ω(G-e)>ω(G),则…

uniapp微信一键登录微信授权

前言 现在小程序逐渐成为主流,常用的微信授权登录很重要很常见的一个功能,今天自己总结了一下。 准备工作 1.如果你想自己想试一下这个功能首先你需要有一个开发中的项目并且你在开发成员里面。 2.配置自己的微信开发者工具的appid码 3.在hbuilderx的…

echarts 如何实现图例单个数据项加上背景颜色和饼图中的背景图自适应

需求: 实现效果如下: ECharts中,可以通过设置legend中的formatter属性来自定义图例项的显示格式。以下是一个示例: option = {// ...legend: {data: [A, B, C],formatter: function (name) {var color = #fff;if (name === A) {color = #ff0000; // 设置A的背景颜色为红色…

如何使用ArcGIS计算容积率

字段计算 为建筑图层新建一个area字段,用于记录单层建筑的面积,如下图所示。 单层建筑面积 为建筑图层新建一个areaAll字段,用于记录总建筑面积,areaAllarea*floor,如下图所示。 计算总面积 为小区图层新建一个area…

chatgpt赋能python:Python大于0的SEO

Python大于0的SEO Python是一种高级编程语言,被广泛用于数据科学、机器学习、Web应用程序和网络爬虫等领域。Python大于0的SEO是指使用Python编写程序来优化网站的排名。在本文中,我们将介绍Python大于0的SEO的基础知识和一些实用技巧。 什么是Python大…

【redis基础】哨兵

hi,这里是redis系列文章,本篇是【redis基础】哨兵,上一篇链接:【redis】redis主从复制_努力努力再努力mlx的博客-CSDN博客 目录 概念 作用 如何使用哨兵(案例演示实战步骤) redis sentinel架构提前说明 重点参数…

【Java】Java(四十九):注解及自定义注解

文章目录 什么是注解?概述注解的作用自定义注解注解的定义格式带有属性的注解 注解的使用注解的使用格式 元注解元注解的作用:常用元注解: 注解解析 什么是注解? 注解(Annotation)也称为元数据,是一种代码级别的说明注…

数据库管理-第八十期 Exadata to RAC(x86) ADG(20230605)

数据库管理 2023-06-05 第八十期 Exadata to RAC(x86) ADG1 环境2 搭建流程2.1配置静态监听-主库2.2配置静态监听-备库2.3配置本地命名-主备库2.4数据库配置-主库2.5生成参数文件和密码文件-主库2.6创建目录并上传密码文件-备库2.7添加数据库服务-备库2.8修改参数文件-备库2.9复…

超级智能的治理

原文链接:https://openai.com/blog/governance-of-superintelligence#SamAltman 作者丨Sam Altman,Greg Brockman,Ilya Sutskever 译者 | Ted Liu 审校 | LsssY 编辑丨肖钰雯 现在是开始思考超级智能治理的好时机--未来的人工智能系统甚至比通…

基于SpringBoot+vue的租房网站设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…