articleList

23-Sharding-Jdbc水平分库+水平分表配置实战

2025/03/13 posted in  ShardingJDBC
Tags: 

  • 库表结构
    • 2个数据库、每个库2张表
  • 需求
    • 插入订单数据,分布在不同的库和表上
  • 操作
    • 建立库表
    • 分库分表配置
      • 分库规则 根据 user_id 进行分库
      • 分表规则 根据 product_order_id 订单号进行分表
#配置分库规则
spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.algorithm-expression=ds$->{user_id % 2 }

#id生成策略
spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE

# 指定product_order表的数据分布情况,配置数据节点,行表达式标识符使用 ${...} 或 $->{...},
# 但前者与 Spring 本身的文件占位符冲突,所以在 Spring 环境中建议使用 $->{...}
#spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds0.product_order_$->{0..1}
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds$->{0..1}.product_order_$->{0..1}

# 指定product_order表的分片策略,分片策略包括【分片键和分片算法】
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{id % 2}
  • 单元测试
    @Test
    public void testSaveProductOrder(){

        Random random = new Random();
        for(int i=0; i<20;i++){
            ProductOrderDO productOrderDO = new ProductOrderDO();
            productOrderDO.setCreateTime(new Date());
            productOrderDO.setNickname("小滴课堂i="+i);
            productOrderDO.setOutTradeNo(UUID.randomUUID().toString().substring(0,32));
            productOrderDO.setPayAmount(100.00);
            productOrderDO.setState("PAY");

            productOrderDO.setUserId( Long.valueOf(random.nextInt(50)) );

            productOrderMapper.insert(productOrderDO);
        }
    }
  • 数据库和表的下标如果不想从0开始,则hash取模后+1
    • {user_id % 2+1}