溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ShardingSphere的坑是怎樣的

發(fā)布時(shí)間:2021-10-20 10:14:50 來(lái)源:億速云 閱讀:258 作者:柒染 欄目:大數(shù)據(jù)

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,如下圖:

ShardingSphere的坑是怎樣的

ShardingSphere的坑是怎樣的

截屏的這一步操作是在做什么呢?他主要是查找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è)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(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)容。

AI