一个goldendb引发的血案

前言

因为我所负责的系统需要做系统迁移,这次迁移从移动云上迁移到内部私有云,然后就悲催的吃上了国产化的螃蟹。首先服务器操作系统使用的是欧拉操作系统,然后就是kafka采用了自己封装了认证模块的,最后就是数据库从mysql改成了goldendb。迁移之前对方数据库小组和我说:"你放心,goldendb就是封装了mysql8.0,问题不大的",但十几年的软件行业从业经历告诉我,不要信他们的鬼话。之前有一篇讲Maven工程如何引入非Maven工程的jar包,也是这个数据库给让我教的学费。虽然我只是负责协调和管理,主要还是开发在做的测试,但记录一下也方便遇到同样问题的人能够尽快解决。

环境:jdk8 \ goldendb 6.1.03 \ 驱动 5.1.46.28

遇到的问题

问题遇到了三个:

1、如何在maven工程中引入非maven工程的jar包,上一篇《pom如何引入非Maven工程的jar包》已经说过了;

2、使用sharding-jdbc连接goldendb报"where 1!=1 "异常;

3、使用的分页插件PageHelper报错;

经历的过程

这里主要是问题1和问题2花费时间较长,这里主要说说问题2.

我们使用的是微服务,总共大概六七个服务。在问题1解决后,其他的服务都能运行的起来,但是服务A启动的时候直接报如下异常:

sql 复制代码
check the manual that corresponds to your MySOL server version for the right syntax to use near '"table_name"' WHERE 1!=1 at line 1

尝试1

我的第一反应让开发检查sql文件中有没有where 1! = 1 或where 1 = 1这种语句,因为我认为可能是提供给我们的goldendb做了限制不允许使用这么这种写法。然后开发反馈我们的sql中只有where 1 = 1语句,并且注释掉了。

重新一运行,yes,tmd还是报错。

尝试2

为了排除干扰因素和方便沟通,我让开发自己写一个简答的demo,配置上sharding-jdbc在连接goldendb试试。因为开发反馈服务A与其他服务相比多了sharding-jdbc,所以我觉得尝试写个新的demo,确定问题在sharding-jdbc上,而不是其他因素导致的。

重新一运行,yes,grd还是报错。

尝试3

我开始怀疑他们给我们安装的goldendb与sharding-jdbc不兼容,但是当我们将这个demo给到数据库组的某位大佬让他跑一下程序时,他是这样说的:

而且他还出示了他在他那边运行的成功的证明:

尝试4

基于尝试3,我开始环境是数据库版本的问题,版本发出来后发现我们的是6.1.03,而能正常运行的是6.13.04(对方只报了一串数字61304,6.13.04是我猜的)。所以我怀疑新版做了sharding-jdbc的兼容,而我们的版本没有做。

于是,我希望数据库组能安装一下我们的版本,或者安装一下他们的版本在做一下测试,没有得到回应。因为这玩意是付费我们没有公司领导授权拿不到安装包,所以最后我没办法验证是不是他那个版本是支持sharding-jdbc的。

尝试5

经过多次在数据库服务器抓包查看执行日志,发现好几种尝试任然报异常"where 1!=1"。比如怀疑springboot版本的问题、sharding-jdbc的问题,但都被一一否决了。但是尝试中发现使用goldendb驱动连接本地mysql sharding-jdbc不报错,使用goldendb驱动连接goldendb就不行,那么已经排除了驱动的问题。

尝试6

数据库组中研发驱动的大佬坚持去看了sharding-jdbc源码,找到了问题所在。shardingjdbc如果url使用jdbc:goldendb,无法识别回填给MysqlDatabaseType这个参数,没有对应的databaseType,默认是SQL92DatabaseType。默认的配置就是给表名拼接,默认是用双引号,最终导致刚刚那个问题。需要将url中jdbc:goldendb改成jdbc:mysql可以规避。

总结

搞了整整3天才找到问题根源,完整的兼容sharding-jdbc的数据源参数配置如下:

makefile 复制代码
driver-class-name: com.goldendb.jdbc.Driver
url: idbc:mysql://ip:port/unity burying point prod?useUnicode=...
username: username
password: password

同时问题3的分页插件问题,在配置里将数据库方言配置改成:

ini 复制代码
pagehelper.helperDialect=mysql

干了这么多年,其实很多时候都知道去看源码是最好的途径,他让你知道为什么出问题了。但是人的本能还是抱着一种侥幸心理,我在试试这种可能也许这个问题就解决了呢?这也许就是研发和开发的区别,也是大佬和码农的区别吧!

以上只是解决了,但是并不能保证这么修改会不会带来其他问题。要想确认是否会带来其他问题,还需要去看看数据库驱动和sharding-jdbc是否有通过url中的要素做判断的。有知道的大佬可以告诉我一下,有兴趣的大佬和自己研究一下。

另外,根据最终问题的原因,其实还有一个解决方案,就是修改sharding-jdbc关于MysqlDatabaseType类型识别的代码中加入对goldendb的判断,用修复后的sharding-jdbc。

本人水平一般能力有限,本文如有误之处还望指正,感谢!

相关推荐
挺菜的14 分钟前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法
掘金-我是哪吒1 小时前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
亲爱的非洲野猪1 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm1 小时前
spring事件使用
java·后端·spring
老纪的技术唠嗑局2 小时前
OceanBase PoC 经验总结(二)—— AP 业务
数据库
微风粼粼2 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄2 小时前
设计模式之中介者模式
java·设计模式·中介者模式
阿里云大数据AI技术2 小时前
OpenSearch 视频 RAG 实践
数据库·人工智能·llm
rebel2 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温3 小时前
5种高效解决Maven依赖冲突的方法
java·maven