您好,登錄后才能下訂單哦!
ShardingSphere的坑是怎樣的,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
現(xiàn)象
4.0.0-RC1版本,我設(shè)置了數(shù)據(jù)自動(dòng)生成分布式主鍵ID,然后當(dāng)我進(jìn)行數(shù)據(jù)插入的時(shí)候,我發(fā)現(xiàn)其中一個(gè)字段value值是null的時(shí)候,這個(gè)自動(dòng)生成的主鍵ID賦值錯(cuò)亂了。
找問題
那咋辦呢?只能從他的原理以及源碼入手了。設(shè)置了自動(dòng)生成分布式主鍵,那么他是怎么操作的呢?
經(jīng)過一番查詢和測(cè)試之后,ShardingSphere是這么做的。他拿到業(yè)務(wù)層處理的sql之后,他在這個(gè)sql上面進(jìn)行了改造。舉個(gè)例子,我要在user表里面插入一條數(shù)據(jù),sql如下:
INSERT INTO user (name, remark, age) VALUES ('test', null, 18);
然后ShardingSphere會(huì)進(jìn)行處理,他會(huì)在我原有的sql上加ID,然后正常得到的sql應(yīng)該是:
INSERT INTO user (name, remark, age, id) VALUES ('test', null, 18, '主鍵id');
但是事實(shí)卻是這樣的:
INSERT INTO user (name, remark, age, id) VALUES ('test', 18, '主鍵id', null);
怎么會(huì)這樣呢?看起來(lái)感覺像是最后賦值的時(shí)候null的情況判斷是有問題的,那么我們接下去繼續(xù)去看源碼。
又是一番debug + 查找之后。。。。
發(fā)現(xiàn)有這樣一個(gè)抽象類InsertOptimizeResultUnit,其中有一個(gè)方法是getCurrentIndex,如下圖:
截屏的這一步操作是在做什么呢?他主要是查找value這個(gè)數(shù)組的最后一位的下標(biāo)是多少,由于他每一次都對(duì)value進(jìn)行了非空判斷,也就是說(shuō)只要有一個(gè)value值為空,那么這個(gè)下標(biāo)計(jì)算出來(lái)就會(huì)少1。那么最后最后造成的結(jié)果就是明明他應(yīng)該在age后面加上id,但是由于下標(biāo)計(jì)算錯(cuò)誤導(dǎo)致id的value值去覆蓋了age的value值。
解決方案
首先先去github上提交了issue,地址是https://github.com/apache/incubator-shardingsphere/issues/2897
先看ShardingSphere的開發(fā)者是否已經(jīng)解決了這個(gè)問題,如果他們要在后續(xù)的版本進(jìn)行解決的話,目前只有兩個(gè)方案解決了:
1.我只能先暫時(shí)對(duì)字段加一個(gè)默認(rèn)值,盡量使value不為空(不太好) 2.將github上的代碼拉下來(lái),然后自己修改源碼然后自己打一個(gè)包來(lái)用(較合適)
看完上述內(nèi)容,你們掌握ShardingSphere的坑是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。