springboot 实现读写分离,分库分表 (三) 使用SHARDINGJDBC分表

我们知道,当表的数量大于一定限度的情况下,操作起来就非常慢

所以我们就可以把表分成拆分成多个表保存,

比如我一个user表,未拆分前,有五千万条数据,

我们就可以把它拆成10个表来保存,

当然你的主键是一个有序自增长的序列,这个自增长的ID必须在插入之前就分配,

可以参考分布式ID生成机制(下个博客介绍),

通过SHARDINGJDBC我们就可以设定一个规则,

比如每个插入库的ID我们可以取模,然后插入到对应的表中

比如我们把user表拆分成3个表: user_0,user_1,user 2

现在我们有10个要插入的user对象,10个对象的id分别为0,1,2,3,4,5,6,7,8,9

插入前我们就可以用ID%3,可以得到每个对象要插入的表 

id为(0,3,6,9 )%3 为 0 插入到 user_0

id为 (1,4,7)%3 为 1 插入到 user_1

id为 (2,5,8)%3 为 2 插入到 user_2

大概的逻辑就是主要,下面是主要代码片段

1,配置文件

spring:
  shardingsphere:
    props:
      sql:
        show: true
    datasource:
      names: master,slave
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.89.129:3306/shrek-db?characterEncoding=utf-8
        username: root
        password: 123456
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.89.130:3306/shrek-db?characterEncoding=utf-8
        username: root
        password: 123456
    sharding:
      master-slave-rules:
        ds0:
          master-data-source-name: master     #定义节点ds0的主库
          slave-data-source-names: slave      #定义节点ds0的从库
      tables:
        user:
          actual-data-nodes: ds0.user_${0..2}    #绑定user表所在节点  这里定义user_${0..2} 表示有3个表,查询的时候会查所有表
          table-strategy:
            standard:
              sharding-column: id              #分片规则的字段
              precise-algorithm-class-name: com.shrek.msproject.algorithm.MyPreciseDayShardingAlgorithm #分片规则自定义类

2,写自定义规则类

public class MyPreciseDayShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {

    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Integer> preciseShardingValue) {
        //preciseShardingValue是传入的对象信息,有操作对象的逻辑表名和传入的ID
        //这个返回的根据preciseShardingValue拼成的实际表名,比如 user_0,user_1等
        return preciseShardingValue.getLogicTableName()+"_"+preciseShardingValue.getValue()%3;
    }
}

下面是增加,查询的效果

1,增加效果,按ID插入主库的各个分表,从表同步主表数据。

2查询所有效果,会查询从库下配置信息下DS0节点的 ds0.user_${0..2},3个类

3,根据ID查询单个信息,根据ID取模定位到表查询出从库数据

猜你喜欢

转载自blog.csdn.net/shrek11/article/details/102719054