美文网首页already
shardindjdbc-complex策略

shardindjdbc-complex策略

作者: 念䋛 | 来源:发表于2022-09-12 20:49 被阅读0次

支持多分片键的复杂分片策略。
配置参数:complex.sharding-columns 分片键(多个);
complex.algorithm-class-name 分片算法实现类。
sql和源码
https://gitee.com/zhangjijige/shardingjdbc.git
配置

spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    # 参数配置,显示 sql
    props:
      sql:
        show: true
    # 配置数据源
    datasource:
      # 数据源别名
      names: db0, db1, db2, db3
      # db1数据源信息
      db0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/order_db_0?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
        username: root
        password: root
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/order_db_1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
        username: root
        password: root
      db2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/order_db_2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
        username: root
        password: root
      db3:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/order_db_3?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
        username: root
        password: root
    sharding:
      tables:
        # 逻辑表名
        tbl_order:
          # 指定数据节点
          actual-data-nodes: db$->{0..3}.tbl_order_$->{0..3}
          # 分库策略
          database-strategy:
            standard:
              sharding-column: user_id
              precise-algorithm-class-name: com.example.shardingjdbc.sharding.algorithm.DBPreciseShardingAlgorithm
          # 分表策略
          table-strategy:
            complex:
              sharding-columns: order_id,user_id
              # 复合分表分片配置类
              algorithm-class-name: com.example.shardingjdbc.sharding.algorithm.MyComplexShardingAlgorithm
mybatis:
  mapper-locations: classpath:mapper/*.xml

策略类

public class MyComplexShardingAlgorithm implements ComplexKeysShardingAlgorithm<Long> {
    private final static String ORDER_ID = "order_id";
    private final static String USER_ID = "user_id";

    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames,
                                         ComplexKeysShardingValue<Long> shardingValue) {

        Collection<Long> orderIds = getShardingValue(shardingValue, ORDER_ID);
        Collection<Long> userIds = getShardingValue(shardingValue, USER_ID);

        Set<String> tables = new HashSet<>();
        for (Long userId : userIds) {
            for (Long orderId : orderIds) {
                int index = getIndex(userId, orderId, availableTargetNames);
                for (String tableName: availableTargetNames) {
                    if (tableName.endsWith(String.valueOf(index))) {
                        tables.add(tableName);
                    }
                }
            }
        }

        return tables;
    }

    private Collection<Long> getShardingValue(ComplexKeysShardingValue shardingValue, String key) {
        Collection<Long> valueList = new ArrayList<>();
        Map<String, Collection<Long>> columnNameAndShardingValuesMap =
                shardingValue.getColumnNameAndShardingValuesMap();
        if (columnNameAndShardingValuesMap.containsKey(key)) {
            valueList.addAll(columnNameAndShardingValuesMap.get(key));
        }

        return valueList;
    }

    private int getIndex(Long userId, Long orderId, Collection<String> availableTargetNames) {
        String userIdStr = String.valueOf(userId);
        String orderIdStr = String.valueOf(orderId);
        int sum = Integer.parseInt(userIdStr.substring(userIdStr.length() - 1)) + Integer.parseInt(orderIdStr.substring(orderIdStr.length() - 1));
        return sum % availableTargetNames.size();
    }
}

doSharding方法的入参


image.png

会有疑问doSharding方法中的入参shardingValue是如何获取数据的
这个涉及到源码,主要是mybatis组装sql后,shardingjdbc会解析sql,并结合分片建获取分片建的数据,具体可以看源码方法
org.apache.shardingsphere.core.route.router.sharding.ParsingSQLRouter#route
方法中的
OptimizeResult optimizeResult = OptimizeEngineFactory.newInstance(shardingRule, sqlStatement, parameters, generatedKey.orNull()).optimize();

相关文章

  • shardindjdbc-complex策略

    支持多分片键的复杂分片策略。配置参数:complex.sharding-columns 分片键(多个);compl...

  • 谈判中迫使对方让步的策略

    软硬策略(红白脸策略) 制造竞争策略 虚张声势策略 各个击破策略 吹毛求疵策略(先苦后甜) 积少成多策略 最后通牒策略

  • 《伍尔福克教育心理学》读书笔记十

    学习策略包括:元认知策略、认知策略、资源管理策略 一、认知策略包括:(一)复述策略(二)精细加工策略(三)组织策略...

  • 学生学习策略

    学生学习大策略。 考试的策略,记忆的策略,记单词的策略,预习听课作业策略,各科学习的策略。 复习的策略,阅读的策略...

  • 淘宝营销策略有哪些?天晓网络来教你

    淘宝营销策略包括六大方面:产品策略丶品牌策略丶价格策略丶促销策略丶服务策略以及客户关系管理策略。 产品策略 1 什...

  • 读2022年版课程标准

    学习策略,学习策略主要包括元认知策略,认知策略,交际策略,情感管理策略等,其中,元认知策略有助于学生计划监控,评价...

  • Bibox—CTA策略参数详解

    CTA策略简介 Bibox CTA策略分为基础策略和高阶策略 分类 基础策略:双均线、MACD、均线止盈高阶策略:...

  • 路由策略

    路由策略和策略路由 什么是路由策略?路由策略和策略路由有什么区别? 如何配置路由策略? https://blog....

  • 设计模式——策略模式

    策略模式 IStrategy 抽象策略 StrategyOne 具体策略 StrategyTwo 具体策略 Str...

  • 学习策略

    考试大纲:了解学习策略分类,掌握认识策略、元认识策略和资源管理策略。 学习策略的含义及特点 …… 学习策略分类: ...

网友评论

    本文标题:shardindjdbc-complex策略

    本文链接:https://www.haomeiwen.com/subject/ixoqortx.html