公众号merlinsea
背景
假设某个数据库中有product_order_0表和product_order_1表,这两张表根据id进行分表,id%2==0的数据放在product_order_0表 中,id%2==1的数据放在product_order_1表中,在昨天的公众号中我们解决了精确匹配问题,那么如果我们查询的sql是范围匹配 between-and的条件,那么怎么处理呢?
比如 select * from product_order where id between 1 and 2; 【这里的id是分片键,同时这个分片键是用between-and进行限制】,这个时候就需要用到范围分片。
没配置的话会报错 Cannot find range sharding strategy in sharding rule.
1、编写范围分表类,实现RangeShardingAlgorithm<T>,范型T是分片键的数据类型
public class CustomRangeShardingAlgorithm implements RangeShardingAlgorithm<Long> { /** * * @param dataSourceNames 数据源集合 * 在分库时值为所有分片库的集合 databaseNames * 分表时为对应分片库中所有分片表的集合 tablesNames * * @param shardingValue 分片属性,包括 * logicTableName 为逻辑表, * columnName 分片健(字段), * valueRange 为从 SQL 中解析出的between-and值 * @return */ @Override public Collection<String> doSharding(Collection<String> dataSourceNames, RangeShardingValue<Long> shardingValue) { Set<String> result = new LinkedHashSet<>(); //between 开始值 Long lower = shardingValue.getValueRange().lowerEndpoint(); //between 结束值 Long upper = shardingValue.getValueRange().upperEndpoint(); //这里的i都是用于分表的key for(long i=lower;i<=upper;i++){ //按照分表规则匹配每一张表,把符和规则的表加入到result中 for(String datasource : dataSourceNames){ String value = i % dataSourceNames.size() +""; if(datasource.endsWith(value)){ result.add(datasource); } } } return result; } }
2、在application.properties配置文件中添加如下内容
注意:我们下面的这个配置是针对product_order表的
#范围分片(水平分表) spring.shardingsphere.sharding.tables.product_order.table-strategy.standard.range-algorithm-class-name=net.xdclass.strategy.CustomRangeShardingAlgorithm
关于leetcode算法训练营:
加我微信号私聊参加训练营,尤其是想进入大厂工作的同学,算法是绕不过去的坎,我自己花了三年时间刷算法,总结思路,刷各种数据结构课程,加入我的训练营,我手把手以在线直播课的形式带你理思路,手把手带你写代码,让你真正体会算法之美~,同时遇到不明白的地方可以直接课上和我沟通,彻底解决你的代码困难症~
本人用c++刷了800道左右的算法,java语言刷了600道左右的算法题,并对这些题做了详细的个人总结。本科期间系统学习了数据结构与算法课程,同时考研过程中写完了率辉主编的《2020年数据结构高分笔记》和《数据结构1000题》,看完的视频包括《mooc浙大数据结构国家精品课程》和《王道考研408数据结构课程》,《王道2019年算法题讲解视频》,最终以初试专业第三名进入了北理工软件工程专业。熟悉并掌握常见的数据结构,比如链表、数组、树、图、队列、堆栈等等,精通数据结构教材中的所有算法,比如常见的遍历算法、动态规划,递归,回溯,剪枝,并查集,最短路径,拓扑排序等,所以快加入训练营吧,我们一起进步
奔跑的小梁,公众号:梁霖编程工具库我决定了,算法文档开源!!