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的坑是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。