ShardingSphere的强制路由

举报
周杰伦本人 发表于 2022/10/30 18:30:03 2022/10/30
【摘要】 ShardingSphere的强制路由 配置 原理分析 HintManager 配置类 总结 ShardingSphere的强制路由随着项目的越来越庞大,用户量越来越多,分库分表的操作在工作中是不可避免的,而市场上分库分表的解决方案有很多,ShardingSphere就是经常使用到的一种分库分表技术。我们知道ShardingSphere可以进行分库分表,支持多种配置,包括xml,yaml等...

ShardingSphere的强制路由

随着项目的越来越庞大,用户量越来越多,分库分表的操作在工作中是不可避免的,而市场上分库分表的解决方案有很多,ShardingSphere就是经常使用到的一种分库分表技术。

我们知道ShardingSphere可以进行分库分表,支持多种配置,包括xml,yaml等等。它的分库分表很简单,只要在配置文件中进行相关参数的配置就可以,对业务代码没有侵入性,今天我们要讲的不是分库分表,而是在进行分库分表后怎么实现强制路由访问某个特定库或者特定表呢?

利用ShardingSphere的Hint 机制我们可以实现这一功能

配置

具体做法就是使用ShardingSphere给我们提供的一个HintManager类,设置相关的属性就可以

hintManager.addDatabaseShardingValue("health_record", 3L);
hintManager.addTableShardingValue("health_record", 2L);
hintManager.setDatabaseShardingValue(1L);
hintManager.setMasterRouteOnly();

这几段代码的意思分别是设置分库的和分表的值,第三个方法是设置数据库分片值的设置,第四个方法是仅仅路由主库中

原理分析

为什么这样设置后就可以实现强制路由呢?

HintManager

我们在代码配置中提到了HintManager类,我们看一下这个类是做什么的

HintManager这个类是使用的单例模式,直接通过 ThreadLocal来注入分片进行管理,那显然它的作用范围是当前线程,HintManager实现了AutoCloseable接口,这个接口的功能就是用来自动关闭当前资源的接口,HintManager可以进行sql连接资源的释放,包括Connection、Statement对象等等

配置类

强制路由涉及到的配置类是HintShardingStrategyConfiguration

@Getter
public final class HintShardingStrategyConfiguration implements ShardingStrategyConfiguration {
    
    private final String shardingAlgorithmName;
    
    public HintShardingStrategyConfiguration(final String shardingAlgorithmName) {
        Preconditions.checkNotNull(shardingAlgorithmName, "Sharding algorithm name is required.");
        this.shardingAlgorithmName = shardingAlgorithmName;
    }
}

还有一个接口是HintShardingAlgorithm接口,用户可以实现这个接口来定义分片的算法

总结

这篇文章我们讲解了ShardingSphere如何强制路由的,以及涉及到的代码的分析,主要是一个HintManager类来获取唯一实例后设置相关的分库和分表的值进行路由操作,其中对于分片的算法我们可以实现HintShardingAlgorithm接口来实现。文章若有不当之处欢迎批评指正。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。