文档章节

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

PageYi
 PageYi
发布于 2017/10/25 09:59
字数 804
阅读 44
收藏 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
粉丝 7
博文 8
码字总数 5535
作品 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源码解析全集

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

天河2018
05/03
0
0
【死磕Sharding-jdbc】—–路由&执行

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

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

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

狂小白
03/19
0
0
【死磕Sharding-jdbc】— 死磕 Sharding-jdbc 精品合集

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

飞哥-Javaer
08/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jQuery学习笔记180924

jQuery - AJAX 简介 什么是 AJAX? AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML)。 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行显示...

颖伙虫
27分钟前
1
0
springboot整合vue小试牛刀

序 本文主要研究一下如何在springboot工程整合vue maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-we......

go4it
28分钟前
1
0
使用python的profiler工具

主要用来检测python coding的执行时间 fly profiler

steel7c4
32分钟前
0
0
大数据日知录笔记

硬件成本的快速下降,使得电子设备的无处不在成为可能,数据无处不在,无时不在. IBM用3V(Volume,Velocity,Variety)来描述大数据的特点,后来又增加了Value这个维度,即价值密度低的数据成为大数据...

凌渡
41分钟前
0
0
IDEA、WebStorm最新永久激活方式

今天早上一大早打开IDEA发现激活已过期,遂开始寻找激活码。但是一直不成功,后来终于找到一种比较靠谱的激活方式。在此记录下来,以备不时之需。 目前网上现有的激活方式大概有这么三种 激活...

耒耒耒耒耒
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部