Spring Boot整合Sharding-JDBC实现强制路由

2023-12-19

强制路由

ShardingSphere使用ThreadLocal管理分片键值进行Hint强制路由。可以通过编程的方式向HintManager中添加分片值,该分片值仅在当前线程内生效。 Hint方式主要使用场景:

  1. 分片字段不存在SQL中、数据库表结构中,而存在于外部业务逻辑。

  2. 强制在主库进行某些数据操作。

简单来说,强制路由可以让我们显式指定某个库或某个表来执行我们的数据库操作

HintManager

在Sharding-JDBC中,强制路由是依靠HintManager实现的, HintManager 是一种上下文,可以用于存储一些特殊的路由信息,以便在路由规则无法满足需求时进行强制路由和强制分库分表

public final class HintManager implements AutoCloseable {
    //基于ThreadLocal存储HintManager实例
    private static final ThreadLocal<HintManager> HINT_MANAGER_HOLDER = new ThreadLocal<>();
    //数据库分片值
    private final Multimap<String, Comparable<?>> databaseShardingValues = HashMultimap.create();
    //数据表分片值
    private final Multimap<String, Comparable<?>> tableShardingValues = HashMultimap.create();
    //是否只有数据库分片
    private boolean databaseShardingOnly;
    //是否只路由主库
    private boolean masterRouteOnly;}

获取HintManager

HintManager hintManager = HintManager.getInstance();

强制分片

要使用HintManager进行强制路由分片,那么需要使用Hint分片算法,Hint分片算法需要我们实现org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm接口。ShardingSphere在进行Routing时,如果发现LogicTable的TableRule采用了 Hint的分片算法,将会从HintManager中获取分片值进行路由操作。

/**
 * 自定义强制路由类
 */
public class MyHintShardingAlgorithm implements HintShardingAlgorithm<Long>  {


    /**
     *  定义强制路由策略
     *  collection: 分片目标:表示当前可用的数据源或数据表名称,对哪些数据库 表进行分片,比如做分库路由
     *  hintShardingValue: 分片值, 分片键的值
     */
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, HintShardingValue<Long> shardingValue) {
        Collection<String> result = new ArrayList<>();
        // 遍历数据源
        for (String actualDb : availableTargetNames) {
            // hintShardingValue: 代表分片值, 指的是使用者对分片键赋的值
            Collection<Long> values = shardingValue.getValues();
            for (Long value : values) {
                //直接路由到与我们传入的路由值相等的数据源上
                if(actualDb.endsWith(String.valueOf(value))){
                    result.add(actualDb);
                }
            }
        }
        return result;
    }
}

配置

# 对t_course表进行强制路由
# 强制路由库设置
spring.shardingsphere.sharding.tables.t_course.database-strategy.hint.algorithm-class-name=com.example.demo.shardingsphere.MyHintShardingAlgorithm
# 强制路由表设置
spring.shardingsphere.sharding.tables.t_course.table-strategy.hint.algorithm-class-name=com.example.demo.shardingsphere.MyHintShardingAlgorithm

添加分片键值

使用hintManager.addDatabaseShardingValue来添加数据源分片键值。
使用hintManager.addTableShardingValue来添加表分片键值。

分库不分表情况下,强制路由至某一个分库时,可使用hintManager.setDatabaseShardingValue方式添加分片。

清除分片键值

分片键值保存在ThreadLocal中,所以需要在操作结束时调用hintManager.close()来清除ThreadLocal中的内容。

close方法实际调用的是clear方法,而clear方法调用的是ThreadLocal的remove方法

 	/**
     * Clear threadlocal for hint manager.
     */
    public static void clear() {
        HINT_MANAGER_HOLDER.remove();
    }
    
    @Override
    public void close() {
        HintManager.clear();
    }

下面是一个简单的示例

		 //使用hintManager对数据库和表进行分片
  		String sql = "SELECT * FROM t_order";
        try (HintManager hintManager = HintManager.getInstance();
             Connection conn = dataSource.getConnection();
             PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
            hintManager.addDatabaseShardingValue("t_order", 1);
            hintManager.addTableShardingValue("t_order", 2);
            try (ResultSet rs = preparedStatement.executeQuery()) {
                while (rs.next()) {
                    // ...
                }
            }
        }

		//使用hintmanager对数据库进行分片,不使用分片表,只路由到一个数据库
        String sql = "SELECT * FROM t_order";
        try (HintManager hintManager = HintManager.getInstance();
             Connection conn = dataSource.getConnection();
             PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
            hintManager.setDatabaseShardingValue(3);
            try (ResultSet rs = preparedStatement.executeQuery()) {
                while (rs.next()) {
                    // ...
                }
            }
        }

可以看到,单独路由某个库,使用setDatabaseShardingValue设置值即可,如果需要路由库和表,则需要设置addDatabaseShardingValue和addTableShardingValue两个值

强制访问主库

在读写分离的情况,有些时候,我们想要直接访问主库,来保证数据的实时性,这就可以使用我们的强制主库路由

设置主库路由

使用hintManager.setMasterRouteOnly方法设置主库路由,通过调用该方法,可以指定只路由到主库

示例

String sql = "SELECT * FROM t_order";
try (
        HintManager hintManager = HintManager.getInstance();
        Connection conn = dataSource.getConnection();
        PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
    hintManager.setMasterRouteOnly();
    try (ResultSet rs = preparedStatement.executeQuery()) {
        while (rs.next()) {
            // ...
        }
    }
}

只需要调用 hintManager.setMasterRouteOnly()方法即可,setMasterRouteOnly()会将只进行主库路由的标识设置为 true,这样在后续的数据路由过程中,将忽略从库的存在,只路由到主库。

public void setMasterRouteOnly() {
        masterRouteOnly = true;
}

使用之后,调用close或clear方法清除ThreadLocal变量

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot整合Sharding-JDBC实现强制路由 的相关文章

随机推荐

  • 基于5G数据采集传输的食药冷链云解决方案

    对于食品医药行业 一些产品可能需要保持在稳定温度范围内进行保存与运输 才能保证产品质量与安全 为加强冷链运输中的温湿度管理 物通博联提供基于5G数采通信网关的工业物联网解决方案 帮助企业随时了解冷链过程中各种温湿度的变化 从而及时觉察到异常
  • Vue 条件渲染 v-show

    v show 指令 用于控制元素的显示或隐藏 执行条件 当条件为 false 时 会添加一个 display none 属性将元素隐藏 应用场景 适用于显示隐藏切换频率较高的场景 语法格式 div 内容 div 基础用法
  • 【问题】ipynb文件在ubuntu上的运行?

    目录 安装依赖 转换文件 run ipynb文件 是使用 Jupyter Notebook编写的文件 可以将ipynb文件转换为对应的 python文件 之后在ubuntu上运行即可 安装依赖 pip install jupyter not
  • 高效方便管理多版本Node(windows方式)

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 【EI会议征稿】第三届新能源技术创新与低碳发展国际研讨会(NET-LC 2024)

    第三届新能源技术创新与低碳发展国际研讨会 NET LC 2024 2024 3rd International Symposium on New Energy Technology Innovation and Low Carbon Dev
  • 插入数计数类 / 转为换行类dp:AT_agc024_e

    https www luogu com cn problem AT agc024 e 首先题目可以转化成每次插入一个数 满足字典序递增 如果只考虑暴力dfs 先别上dp 想想怎么合法和不算重 合法 也就是插入数有3种情况 插到末尾 插到比他
  • 房屋结构健康监测:守护城市生命线的明眼与智慧

    在12月18日 一场突如其来的灾难降临重庆 房屋建筑坍塌 造成3人死亡2人受伤的严重意外 这场悲剧提醒我们 房屋结构的健康不仅关乎我们的生命安全 更是社会稳定的重要基石 如何预防房屋结构问题 确保城市生命线的安全 成为了一个迫切需要解决的问
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)更改应用图标

    鸿蒙 HarmonyOS 项目方舟框架 ArkUI 更改应用图标 一 操作环境 操作系统 Windows 10 专业版 IDE DevEco Studio 3 1 SDK HarmonyOS 3 1 二 更改图标 图标的位置 entry g
  • 解释Nginx用途

    Nginx是一种流行的开源Web服务器软件 主要用于处理HTTP请求和响应 它的主要用途包括 反向代理 Nginx可以作为反向代理服务器 将客户端的请求转发到后端服务器集群上 它具有高可用性 负载均衡和容错能力 能够处理大量的并发请求 静态
  • 数据结构算法-快速排序

    核心思路 快速排序算法核心思路 选择一个 基准 元素 将数组分为两个子数组 一个包含比基准小的元素 另一个包含比基准大的元素 然后对这两个子数组进行递归排序 基准数 初始化两个索引 i 和 j 分别子数组的开头和结尾 初始化基准元素 bas
  • Python使用HTTP库发送GET请求的示例——轻松探索网络世界

    大家好 今天我要给大家介绍一个非常实用的Python库 HTTP库 它可以帮助我们轻松地发送HTTP请求 今天 我们就来学习一下如何使用HTTP库发送GET请求 首先 我们需要安装HTTP库 如果你还没有安装 可以通过pip命令进行安装 复
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)更改应用图标

    鸿蒙 HarmonyOS 项目方舟框架 ArkUI 更改应用图标 一 操作环境 操作系统 Windows 10 专业版 IDE DevEco Studio 3 1 SDK HarmonyOS 3 1 二 更改图标 图标的位置 entry g
  • 在Java培训班如何进阶学习

    Java作为一门广泛应用的编程语言 学习者在Java培训班学习之后 如何进一步提升自己的技能水平是一个重要的问题 下面将介绍一些进阶学习的方法 帮助学习者更好地掌握Java编程技能 1 深入学习核心概念 在Java培训班学习过程中 学习者已
  • Adobe Reader等停止工作的原因不少,但可修复性很强

    这种情况是随机发生的 比如如果你在正常的状态下关闭了电脑 第二天打开Adobe Reader时可能就会出现这个错误 但别担心 在这篇文章中 我们将解释为什么Adobe Reader或Acrobat DC停止工作 以及我们如何解决这个问题 是
  • 【保姆级教程】使用tensorflow_hub的预训练模型实现神经风格迁移

    目录 一 神经风格迁移 二 安装依赖 三 实践 四 其他 一 神经风格迁移 神经风格迁移 是一种优化技术 主要将两个图像 内容 图像 和 风格
  • 企业数字化转型进入深海区:生成式AI时代下如何制定数据战略

    随着科技的不断进步 企业数字化转型已经不再是简单的概念 而是正在进入一个全新的深海区 在这个深海区 数据变得至关重要 而生成式人工智能 AI 的兴起更是推动了数字化转型的飞速发展 本文将探讨在这个生成式AI时代下 企业应如何制定有效的数据战
  • 探索关系:Python中的Statsmodels库进阶

    目录 写在开头 1 多元线性回归 场景介绍 2 Logistic回归 2 1 Logistic回归的概念 2 2 应用案例 2 2 1 建立模型和预测
  • 房屋坍塌预警监测特点,建设建筑结构监测安全系统

    近年来 随着城市化的快速发展 房屋建筑的数量不断增加 但同时也伴随着一些安全隐患 其中 房屋坍塌是其中一个重要的安全隐患 给人们的生命财产安全带来了巨大的威胁 因此 如何有效地监测和预警房屋坍塌成为了当前的重要课题 一 房屋坍塌预警监测系统
  • 基于生成式对抗网络的视频生成技术

    随着人工智能的快速发展 生成式对抗网络 GAN 作为一种强大的生成模型 已经在多个领域展现出了惊人的能力 其中 基于GAN的视频生成技术更是引起了广泛的关注 本文将介绍基于生成式对抗网络的视频生成技术的原理和应用 探索其对电影 游戏等领域带
  • Spring Boot整合Sharding-JDBC实现强制路由

    目录 强制路由 HintManager 强制分片 强制访问主库 强制路由 ShardingSphere使用ThreadLocal管理分片键值进行Hint强制路由 可以通过编程的方式向HintManager中添加分片值 该分片值仅在当前线程内