SpringBoot使用sharding分库分表、读写分离(主从)

数据库


在这里插入图片描述

在这里插入图片描述
字段
在这里插入图片描述

依赖

主要依赖

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>根据实际选择</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

		<!--使用sharding不能使用druid-spring-boot-starter-->
<!--        <dependency>-->
<!--            <groupId>com.alibaba</groupId>-->
<!--            <artifactId>druid-spring-boot-starter</artifactId>-->
<!--            <version>1.2.11</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.11</version>
        </dependency>

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>

配置数据源

spring:
  shardingsphere:
    # 配置数据源,给数据源起名g1,g2...此处可配置多数据源
    datasource:
      names: g1, g2
      g1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/goods_db
        username: root
        password: root
      g2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/goods_db2
        username: root
        password: root

    # 打开sql输出日志
    props:
      sql:
        show: true

分库分表

分表:在实际使用中根据策略分配到同数据库的不同的表中
分库:在实际使用中根据策略分配到不同数据库的中

spring:
  shardingsphere:
    ### 分库分表
    # 配置表的分布
    sharding:
      tables:
        # 逻辑表名,sql中查询该表时实施策略,select * from g
        g:
          # 真实表名,由 数据源名.表名 组成
          # g$->{1..2}表示数据源从g1到g2
          # goods_$->{1..2}表示数据表从goods_1到goods_2
          actual-data-nodes: g$->{1..2}.goods_$->{1..2}
          key-generator:
            # 指定goods表主键gid 生成策略为 SNOWFLAKE
            column: gid
            type: SNOWFLAKE
          # 配置表策略
          table-strategy:
            inline:
              # 指定分表策略 约定gid值是偶数添加到goods_1表,如果gid奇数添加到tgoods_2表
              sharding-column: gid
              algorithm-expression: goods_$->{gid % 2 + 1}
          # 配置库策略
          database-strategy:
            inline:
              # 根据user_id分库,根据user_id判断奇偶数选择数据源
              sharding-column: user_id
              algorithm-expression: g$->{user_id % 2 + 1}

使用

使用中除了mapper写法有点区别外,其他类、文件与正常使用一致

mapper

Mapper中主要是xml文件里sql写法不同
原 select * from goods_1 where gid = #{gid} and user_id = #{userId}
先需将表名改为g,即 select * from g where gid = #{gid} and user_id = #{userId}
sharding会自动根据gid和user_id的值进行分库分表

如上文所配时:
当user_id为2,偶数,则会选择g1数据源,即goods_db库
当gid为3,奇数,则会选择goods_2表
则最终会使用goods_db库的goods_2表

读写分离(主从)

有两种,一种是全局,另一种是可针对分表配置主从数据库

全局

使用全局主从也许不能使用分库分表,并且sql中表名不能使用分库分表中的写法
即上文中的 select * from g

spring:
  shardingsphere:
    masterslave:
      #主从数据源
      name: ds0
      # 主数据源
      master-data-source-name: g1
      # 从数据源
      slave-data-source-names: g2
      load-balance-algorithm-type: round_robin

针对分表配置

针对分表策略配置

spring:
  shardingsphere:
    ### 分库分表
    sharding:
      tables:
        g:
          # 真实表名,由于是主从策略,因此数据源使用主从数据源,在下文定义
          actual-data-nodes: ds0.goods_$->{1..2}
          key-generator:
            column: gid
            type: SNOWFLAKE
          table-strategy:
            inline:
              sharding-column: gid
              algorithm-expression: goods_$->{gid % 2 + 1}

      master-slave-rules:
        # 主从数据源
        ds0:
          # 主数据源
          master-data-source-name: g1
          # 从数据源
          slave-data-source-names:
            - g2
          load-balance-algorithm-type: ROUND_ROBIN
      # 默认数据源,防止未配置分表的真实表插入时走从表
      default-data-source-name: ds0

使用

会自动根据查询还是插入选择不同的数据源
若使用全局,则和正常使用一致
若使用针对分表配置主从,则和分库分表使用一致,可使用分表策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值