千家信息网

ShardingSphere的坑是怎样的

发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,ShardingSphere的坑是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。现象4.0.0-RC1版本,我设置了数据自动生成分
千家信息网最后更新 2024年11月25日ShardingSphere的坑是怎样的

ShardingSphere的坑是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

  • 现象

4.0.0-RC1版本,我设置了数据自动生成分布式主键ID,然后当我进行数据插入的时候,我发现其中一个字段value值是null的时候,这个自动生成的主键ID赋值错乱了。

  • 找问题

那咋办呢?只能从他的原理以及源码入手了。设置了自动生成分布式主键,那么他是怎么操作的呢?

经过一番查询和测试之后,ShardingSphere是这么做的。他拿到业务层处理的sql之后,他在这个sql上面进行了改造。举个例子,我要在user表里面插入一条数据,sql如下:

INSERT INTO user (name, remark, age) VALUES ('test', null, 18);

然后ShardingSphere会进行处理,他会在我原有的sql上加ID,然后正常得到的sql应该是:

INSERT INTO user (name, remark, age, id) VALUES ('test', null, 18, '主键id');

但是事实却是这样的:

INSERT INTO user (name, remark, age, id) VALUES ('test', 18, '主键id', null);

怎么会这样呢?看起来感觉像是最后赋值的时候null的情况判断是有问题的,那么我们接下去继续去看源码。

又是一番debug + 查找之后。。。。

发现有这样一个抽象类InsertOptimizeResultUnit,其中有一个方法是getCurrentIndex,如下图:

截屏的这一步操作是在做什么呢?他主要是查找value这个数组的最后一位的下标是多少,由于他每一次都对value进行了非空判断,也就是说只要有一个value值为空,那么这个下标计算出来就会少1。那么最后最后造成的结果就是明明他应该在age后面加上id,但是由于下标计算错误导致id的value值去覆盖了age的value值。

解决方案

首先先去github上提交了issue,地址是https://github.com/apache/incubator-shardingsphere/issues/2897

先看ShardingSphere的开发者是否已经解决了这个问题,如果他们要在后续的版本进行解决的话,目前只有两个方案解决了:

1.我只能先暂时对字段加一个默认值,尽量使value不为空(不太好)2.将github上的代码拉下来,然后自己修改源码然后自己打一个包来用(较合适)

看完上述内容,你们掌握ShardingSphere的坑是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0