sharding-jdbc源碼學習筆記(二)-----路由算法

分庫分表後,首先要解決數據庫路由問題,要到哪一個庫去獲取或者變動數據,是多庫路由仍是單庫路由。同時要解決分表問題,路由到指定的表或者所有的表。
好比如下場景:
先假設分片以下:
全部數據源配置:
db_defualt 現有數據庫
db_0_0 我的用戶帳戶分片組0 數據庫0
db_0_1 我的用戶帳戶分片組0 數據庫1
db_1_0 商戶帳戶分片組1 數據庫0
db_1_1 商戶帳戶分片組1 數據庫1算法

帳戶id: 
如今算法:15位序號+1位校驗位,長度爲16位
改造後算法:15位序號+1位校驗位+1位分片組編號基因+1位分片組內分片編號基因,長度變爲18位sql

路由算法:
if(id是16位){
   db = db_defualt(如今的庫);
}else if(id是18位){
   db = db_{id倒數第二位}_{id倒數第一位}
}數據庫

帳戶餘額變更流水id:
如今算法:16序列+4位隨機數,長度變爲20位
改造後算法:16序列+3位隨機數+帳戶id後2位分庫基因,長度變爲21位併發

db路由算法:
if(id是20位){
   db = db_defualt(如今的庫);
}else if(id是21位){
   db = db_{id倒數第二位}_{id倒數第一位}
}分佈式

1,根據帳戶id查詢單帳戶信息。插入和修改帳戶信息路由相同。
根據分佈式id設計規則,帳戶分佈在某個分庫下面,這個時候須要根據路由算法路由到指定的庫(即拿對應datasource 的connection執行sql)
SELECT * FROM ACCOUNT T WHERE T.ACCOUNTID = '0000000008072027' 根據路由算法16位路由到db_default
SELECT * FROM ACCOUNT T WHERE T.ACCOUNTID = '000000000807202701' 18位後兩位決定路由,路由到db_0_1設計

2,查詢某個商戶下面全部的帳戶。
水平分庫後,帳戶可能根據id規則分佈在不一樣的數據庫中,這個時候須要路由到全部的數據庫中執行查詢。
select * from ACCOUNT t WHERE T.CUSTID = '0000000000012345' and currenty='CNY' AND ACCOUNT_TYPE='01' AND SEQ=1
查詢條件中沒有帳戶id,不能根據帳戶id進行路由到指定的庫,這個時候須要所有分庫都執行一遍查詢。
根據上面5個數據源配置,路由到5個數據庫,併發執行5個sql查詢,結果歸併。路由

3,查詢某個商戶下面全部的帳戶可提現餘額彙總(不可提現餘額,授信使用餘額,授信額度彙總)。
水平分庫後,帳戶可能根據id規則分佈在不一樣的數據庫中,這個時候須要路由到全部的數據庫中執行查詢。
select sum(account.uncash_amount) CreditLine from Account account  where account.custid='0000000000012345';
select sum(account.uncash_amount - account.freeze_uncashamount - account.hold_uncashamount ) uncashamount from Account account 
 where account.custid='0000000000012345'(待驗證)
查詢條件中沒有帳戶id,不能根據帳戶id進行路由到指定的庫,這個時候須要所有分庫都執行一遍查詢。
根據上面5個數據源配置,路由到5個數據庫,併發執行5個sql查詢,結果歸併。it

相關文章
相關標籤/搜索