基于springboot使用sharding-sphere实现智能化分库分表

话不多说,直接先上代码

pom.xml文件引入依赖

<dependency>
	<groupId>org.apache.shardingsphere</groupId>
	<artifactId>sharding-jdbc-core</artifactId>
	<version>4.0.1</version>
</dependency>

springboot配置文件中加入如下配置

spring:
  #shardingsphere配置
  #这里先配个比较简单的分表策略,id小于50的进入test1数据源的student_0表,id大于等于50的进入test1数据源的student_1表
  shardingsphere:
#    执行语句是是否打印语句,默认为false
#    props:
#      sql.show: true
    #配置需要使用的数据源,如果要配置多个数据源,请参考注释部分
    datasource:
      names: test1 #,test2
      test1:
        type: org.springframework.jdbc.datasource.DriverManagerDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test_1?serverTimezone=UTC
        username: root
        password: admin
#      test2:
#        type: org.springframework.jdbc.datasource.DriverManagerDataSource
#        driver-class-name: com.mysql.cj.jdbc.Driver
#        url: jdbc:mysql://localhost:3306/test_2?serverTimezone=UTC
#        username: root
#        password: admin
    sharding:
      tables: #分库分表策略
        # 第一个分表策略
        student: #这个key是逻辑表名,即实际sql语句操作的表名,会根据下面的配置路由到其他库的其他表,比如我这里希望让用户操作student表,然后可以自动路由到student_1和student_2
          actual-data-nodes: test1.student_$->{1..2}  #参与分片的物理表,这里可以写行表达式,如果不用行表达式需要写成 test1.student_1,test.student_2  字符串可以与行表达式组合使用,比如test1.student_1,test1.student_$->{2..3},这里相当于指定了三个表
          database-strategy: #分库策略
            standard:
              sharding-column: id  #分库字段
              precise-algorithm-class-name: com.student.shardingsphere.range.DatabasePreciseAlgorithm
          table-strategy: #分表策略
            standard:
              sharding-column: id #分表字段
              precise-algorithm-class-name: com.student.shardingsphere.range.TablePreciseAlgorithm

        # 第二个分表策略
#        tableName: # 再配置一组,对tableName这个表的操作进行切分
#          actual-data-nodes: test1.tableName_0,test1.tableName_1
#          database-strategy:
#            standard:
#              sharding-column: 分库字段
#              precise-algorithm-class-name: 分库算法实现类
#          table-strategy: 
#            standard:
#              sharding-column: 分表字段
#              precise-algorithm-class-name: 分表算法实现类

分库或分表算法实现类: 需要声明一个类,实现PreciseShardingAlgorithm接口,并重写doSharding方法。之后在配置中指定此类的全限定名即可。以下提供实现模板

分库实现类

//分库实现类                                  这里泛型的类型根据分库分表字段类型来设置,比如id在数据库为int,这里则泛型为Integer
public class DatabasePreciseAlgorithm implements PreciseShardingAlgorithm<Integer> {

    @Override                                                              //此处根据实现的接口泛型来泛型
    public String doSharding(Collection<String> collection, PreciseShardingValue<Integer> preciseShardingValue) {
        /* 我这里只分表不分库,所以直接返回指定的数据源名,如果需要分库,只需要进行一些判断后返回不同的数据源名即可。比如
         * if(....){
         *  return "test1";
         * } else {
         *  return "test2";
         * }
         * 需要注意的是这里返回的是数据源名不是数据库名
         */
        return "test1";
    }
}

分表实现类

public class TablePreciseAlgorithm implements PreciseShardingAlgorithm<Integer> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
        //System.out.println("分库分表成功");
        Integer id = shardingValue.getValue();
        if(id < 50 ){
            return "student_0";
        } else{
            return "student_1";
        }
    }
}

使用shardingSphere时,只要ORM层是基于JDBC的框架(比如myBatis,JPA等),或者是直接使用原生的JDBC,都不用修改任何代码。

我这里是基于官网提供的springBoot配置的形式进行了改良(其实就只是把properties文件的配置改成了yml文件的配置)

官网还支持各种不同的配置形式以及支持不同的功能,秉着无论学什么都以官网提供的文档为准,这里献上官网链接:(官方中文哦)
链接: Apache ShardingSphere.

当然了,作为一个apache的顶级项目功能远远不止如此,如果各位有兴趣了解实现原理以及阅览源码,请点击上面的官网链接。

如果文章对你有帮助,请帮我点个赞吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值