Sharding Jdbc强制路由主库

6 篇文章 0 订阅
1 篇文章 0 订阅

Sharding JDBC 主从模式下,查询使用从库,添加更新以及删除数据操作时使用主库,但是在某些实时性比较高的场景,因为主从延时,从库还未同步数据,导致查询不到数据,因此需要强制路由到主库。

在官网教程中,可以使用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()) {
            // ...
        }
    }
}

实际为了更好的使用,需要封装一个注解,使用AOP来动态设置

环境: SpringBoot、MyBatis-Plus、Sharding-JDBC

定义一个注解,@ShardingMaster,用于标注该方法使用主库数据源(这里为Master)

/**
 * sharding数据源 强制读取主库
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@DS("sharding")  //这里指定了数据源为 sharding
public @interface ShardingMaster {
}

定义一个切面 ShardingMasterAspect

@Component
@Aspect
public class ShardingMasterAspect {

    //路径改为实际 @ShardingMaster路径
    @Pointcut("@annotation(com.xx.xx.ShardingMaster)")
    public void pointcut() {
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        Object ret = null;
        HintManager.clear();
        try (HintManager hintManager = HintManager.getInstance()) {
            //强制路由主库
            hintManager.setWriteRouteOnly();
            ret = joinPoint.proceed(args);
        }

        return ret;
    }

}

使用:

@ShardingMaster
public void shardingMasterTest() {
	//to do someing...
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Sharding-JDBC 是一个开源的分库分表中间件,它可以帮助我们实现数据库的水平扩展和分布式架构。在 Sharding-JDBC 中,强制分片路由策略可以用于实现分表操作。 强制分片路由策略是一种在分表操作时,强制路由到指定的分片的策略。通常,在分表操作中,我们会通过某种规则或算法来决定数据应该路由到哪个分片上,比如根据某个字段的哈希值进行路由。而强制分片路由策略则会忽略这些规则,直接将数据路由到指定的分片。 在 Sharding-JDBC 中,我们可以通过配置数据源、分片规则和强制路由规则来实现强制分片路由策略。配置文件中的示例代码如下: ```xml <sharding-rule> <binding-tables> <binding-tables-strategy> <standard> <sharding-column>user_id</sharding-column> <algorithm-expression>user_id % 2</algorithm-expression> </standard> </binding-tables-strategy> </binding-tables> <table-rule> <table>user</table> <actual-data-nodes>ds${0..1}.user_${0..1}</actual-data-nodes> <database-strategy> <standard> <sharding-column>user_id</sharding-column> <algorithm-expression>user_id % 2</algorithm-expression> </standard> </database-strategy> <table-strategy> <standard> <sharding-column>user_id</sharding-column> <algorithm-expression>user_id % 2</algorithm-expression> </standard> </table-strategy> </table-rule> </sharding-rule> ``` 在上述配置中,`user_id` 是用来分片的字段,我们通过对 `user_id` 进行取模运算来实现分表路由。同时,我们可以通过配置强制路由规则,将数据强制路由到指定的分片。 需要注意的是,强制分片路由策略在某些特定场景下可能会有一定的限制和风险,因此在使用时需谨慎评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值