聊聊 Sharding-JDBC 分库分表(四)

love374
发布于 2022-7-12 17:07
浏览
0收藏

 

3、主键生成策略

Sharding-JDBC支持配置主键生成策略,比如使用雪花算法或者UUID方式,配置如下:

spring:
  # Sharding-JDBC的配置
  shardingsphere:
    # 分片的配置
    sharding:
      # 表的分片策略
      tables:
       ## product_base是逻辑表的名称
        product_base:
          # 主键生成策略
          key-generator:
            # 主键
            column: product_id
            # 生成算法
            type: SNOWFLAKE
        shop:
          # 主键生成策略
          key-generator:
            # 主键
            column: shop_id
            # 生成算法
            type: SNOWFLAKE

“SNOWFLAKE:雪花算法”
配置完成后,向product_base插入一条数据,将会直接插入到ds1这个数据库中,demo如下:

@Test
public void test1(){
    Product product = Product.builder()
     .name("Spring Cloud Alibaba实战课程")
     .price(159L)
     .originAddress("码猿技术专栏")
     .shopId(1L)
     .build();
    productMapper.insertProductBase(product);
}

“源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词:9532 获取!”
3. 水平分库
问题来了,现在有很多商家入驻,product_db单库存储数据已经超出预估,商品资源属于访问非常频繁的资源,单台服务器已经无法支撑,此时就需要对其进行水平分库,将商品库拆分成两个数据库:product_db1、product_db2,如下:

聊聊 Sharding-JDBC 分库分表(四)-鸿蒙开发者社区

 水平分库

“product_db1+product_db2数据合并则为完整的商品数据”
Sharding-JDBC 配置也很简单,只需要配置一下数据库的切分规则,配置规则如下:

#分库策略,如何将一个逻辑表映射到多个数据源 
spring.shardingsphere.sharding.tables.<逻辑表名称>.database‐strategy.<分片策略>.<分片策略属性名>=

那么此时需要对product_base、product_description进行数据源切分,按照对2取模的方式,配置如下:

spring:
  # Sharding-JDBC的配置
  shardingsphere:
    # 分片的配置
    sharding:
      # 表的分片策略
      tables:
        product_base:
          database‐strategy:
            inline:
            ## 分片键
              sharding‐column: product_id
             ## 分片算法,内置的精确算法
              algorithm‐expression: ds$->{product_id%2+1}
        product_description:
          database‐strategy:
            inline:
            ## 分片键
              sharding‐column: product_id
              ## 分片算法,内置的精确算法
              algorithm‐expression: ds$->{product_id%2+1}

 

上述配置什么意思?

“product_id是偶数的将会存储在product_db1库中,奇数的存储在product_db2中”
测试也很简单,我们循环往数据库中插入10条商品数据,由于是雪花算法,因此应该有5条在db1库中,另外5条在db2中,单元测试如下:

@Test
public void test3(){
    for (int i = 0; i < 10; i++) {
    Product product = Product.builder()
        .name("Spring Cloud Alibaba实战课程")
        .price(159L)
        .originAddress("码猿技术专栏")
        .shopId(1L)
        .build();
 productMapper.insertProductBase(product);
 productMapper.insertProductDescribe(product.getProductId(),"内容",product.getShopId());
  }
}

观察下控制台的SQL,可以发现是不停的往ds1和ds2中进行插入数据,如下图:

 聊聊 Sharding-JDBC 分库分表(四)-鸿蒙开发者社区
文章转自公众号:码猿技术专栏

标签
已于2022-7-12 17:07:27修改
收藏
回复
举报
回复
    相关推荐