文档章节

sharding-jdbc源码学习笔记(二)-----路由算法

PageYi
 PageYi
发布于 2017/10/25 09:59
字数 804
阅读 45
收藏 0

分库分表后,首先要解决数据库路由问题,要到哪个库去获取或者变更数据,是多库路由还是单库路由。同时要解决分表问题,路由到指定的表或者全部的表。
比如以下场景:
先假设分片如下:
所有数据源配置:
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位

路由算法:
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查询,结果归并。

© 著作权归作者所有

共有 人打赏支持
PageYi
粉丝 8
博文 15
码字总数 14144
作品 0
深圳
私信 提问
sharding-jdbc源码解析全集

本文转自“天河聊技术”微信公众号 sharding-jdbc源码解析之词法解析 sharding源码解析之api分析 sharding-jdbc源码解析之spring集成 sharding-jdbc源码解析之spring集成分片构造实现 shardi...

天河2018
2018/05/03
0
0
sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer
2018/05/03
0
0
【死磕Sharding-jdbc】—–路由&执行

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/09efada2d086 继续以模块中的为基础,剖析分库分表简单查询SQL实现--,即如何执行简单的查询SQL,接下来的分析以执行SQL语句为例...

飞哥-Javaer
2018/05/03
0
0
【死磕Sharding-jdbc】— 死磕 Sharding-jdbc 精品合集

死磕 Sharding-jdbc 是 【阿飞哥】的精心力作,花费 4 个月,总共输出 22 篇文章,全部都是关于 Sharding-jdbc 的原理解析和源码分析,通俗易懂。 下图是 【阿飞哥】 的公众号,欢迎各位关注...

飞哥-Javaer
2018/08/26
0
0
MySQL多数据源笔记5-ShardingJDBC实战

Sharding-JDBC集分库分表、读写分离、分布式主键、柔性事务和数据治理与一身,提供一站式的解决分布式关系型数据库的解决方案。 从2.x版本开始,Sharding-JDBC正式将包名、Maven坐标、码云仓...

狂小白
2018/03/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PDMan-2.1.1 发布:用心开源,免费的国产数据库建模工具(春节前最后一个版本)

一、软件介绍 PDMan 是一款开源免费的数据库模型建模工具,是PowerDesigner之外另一种更好的选择。支持Windows,Mac,Linux等操作系统,具有上手容易,使用简单的特点。 2018年获得码云GVP (Gi...

O龙猫O
43分钟前
8
0
OSChina 周二乱弹 —— 以后我偷小鱼干养你

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @庞巴哥 :只有这节奏瞬间变得轻松。。。。。。。。。分享Talking Eyes的单曲《In the sun (Extended Version)》: 《In the sun (Extended Ve...

小小编辑
今天
45
5
多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
8
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
10
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部