文档章节

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
码字总数 14044
作品 0
深圳
私信 提问
sharding-jdbc源码解析全集

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

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

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

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

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

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

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

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

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

狂小白
03/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 请上车吧

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @2amor :分享王菲的单曲《闷》 《闷》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) @開源中國周杰倫 :昨天睡觉肚子疼,妈蛋,半夜爬起来...

小小编辑
28分钟前
123
6
工作中如何做好技术积累

参考:https://tech.meituan.com/study_vs_work.html 看了这篇文章,觉得总结得非常好,因此摘抄了一些关键点,以便自己经常翻阅。 引言 在繁忙的工作中做好技术积累,构建个人核心竞争力. 在...

grace_233
39分钟前
6
0
day146-2018-11-13-英语流利阅读-待学习

5 岁“牛娃”简历给 985 精英一个暴击 Lala 2018-11-13 1.今日导读 “不要让孩子输在起跑线上”,似乎已成为了当下最流行的名句,每个身为家长或还未成为家长的人都不得不思考这句话的分量。...

飞鱼说编程
51分钟前
4
0
Mariadb二进制包安装,Apache安装

安装mariadb 下载二进制包并解压 [root@test-a src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.t......

野雪球
今天
4
0
ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部