ShardingSphere的强制路由

时间:2022-10-13 21:57:28

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接口来实现。

❤️ 感谢大家

如果你觉得这篇内容对你挺有有帮助的话:

  1. 欢迎关注我❤️,点赞????????,评论????,转发????
  2. 关注盼盼小课堂,定期为你推送好文,还有群聊不定期抽奖活动,可以畅所欲言,与大神们一起交流,一起学习。
  3. 有不当之处欢迎批评指正。