ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

sharding-jdbc精确分片配置

2021-02-21 18:32:05  阅读:185  来源: 互联网

标签:jdbc orderitem algorithm myorder 分片 sharding import id


sharding:
  jdbc:
    config:
      sharding:
        tables:
          myorder:
            key-generator-column-name: id  #主键
            actual-data-nodes: db$->{0..1}.myorder_$->{0..1}
            #分库策略
            database‐strategy:
              standard:
                sharding-column: id
                #精确分库分片配置类
                precise-algorithm-class-name: org.test.sharding.ShardingConfig
            #分表策略
            table-strategy:
              standard:
                sharding-column: id
                #精确分表分片配置类
                precise-algorithm-class-name: org.test.sharding.ShardingTableConfig
          orderitem:  #test
            key-generator-column-name: id  #主键
            actual-data-nodes: db$->{0..1}.orderitem_$->{0..2}    #数据节点,均匀分布
            #分库策略
            database‐strategy:
              inline:
                sharding-column: id
                algorithm-expression: db$->{id%2}
            table-strategy:
              inline:
                sharding-column: id
                algorithm-expression: orderitem_$->{id%2+1}
        #当两个分表的表进行关联查询的时候一定要将这两个表设置绑定表,否则会出现笛卡尔积
        binding-tables[0]: orderitem,myorder
      props:
        sql:
          show: true

    datasource:
      names: db0,db1
      db0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/demo
        username: root
        password: 123456
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/demo1
        username: root
        password: 123456

精确分库策略配置类

/**
 * @author huQi
 * @email
 * @data 2021/1/20 13:04
 */

import io.shardingsphere.api.algorithm.sharding.PreciseShardingValue;
import io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm;
import org.springframework.stereotype.Component;
import java.util.*;
@Component
public class ShardingConfig implements PreciseShardingAlgorithm<Long> {

    /**
     *  在开发的环境中一定不要用随机数来决定是在哪个库,会出现无法准确的定位库的情况
     * @param collection  库名集合
     * @param preciseShardingValue 分片列
     * @return
     */
    
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {
        // 分片字段值
        Long value = preciseShardingValue.getValue();
        // 现在算法是:%2 求余如果是0则ds0.xmjbq_user,如果是1则ds0.xmjbq_user。但是由于id是字符串而且是很长的,所以截取最后一位然后转为Integer类型再求余

        Random random = new Random();
        int pick = random.nextInt(1);
        for (String s : collection) {
            if(s.contains(String.valueOf(pick))){
                return s;
            }
        }
        throw new UnsupportedOperationException();
    }

}

精确分表配置类

import io.shardingsphere.api.algorithm.sharding.PreciseShardingValue;
import io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.Random;

/**
 * @author huQi
 * @email
 * @data 2021/1/20 14:19
 */
@Component
public class ShardingTableConfig  implements PreciseShardingAlgorithm<Long> {
    /**
     * 在开发的环境中一定不要用随机数来决定是在哪个表,会出现无法准确的定位表的情况
     *
     * */
    @Override
    public String doSharding(Collection<String> tables, PreciseShardingValue<Long> preciseShardingValue) {
        // 分片字段值
        Long value = preciseShardingValue.getValue();
        // 现在算法是:%2 求余如果是0则ds0.xmjbq_user,如果是1则ds0.xmjbq_user。但是由于id是字符串而且是很长的,所以截取最后一位然后转为Integer类型再求余

        Random random = new Random();
        int pick = 0;
        if(tables.size()>1){
            pick = random.nextInt(3);
        }

        for (String s : tables) {
            System.out.println("sharding:"+s+"随机数"+pick);
                if(s.contains(String.valueOf(pick))){
                    return s;
                }
        }

        throw new UnsupportedOperationException();
    }
}

数据库

demo:myorder_0,myorder_1,orderitem_0,orderitem_1,orderitem_2

demo1:myorder_0,myorder_1,orderitem_0,orderitem_1,orderitem_2

标签:jdbc,orderitem,algorithm,myorder,分片,sharding,import,id
来源: https://www.cnblogs.com/huqi96/p/14426728.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有