Java分表策略

分表配置

再yml文件中,jdbc数据库连接下面,可以配置分表策略,其中的{0..15}是配置分表的数量。

并且在最后与配置文件   StationTableShardingConfig绑定

sharding:
      tables:
        t_station:
          actual-data-nodes: ds${0}.t_station${0..15}
          logic-table: t_station
          table-strategy:
            standard:
              sharding-column: org_station_no
              precise-algorithm-class-name: cn.nhd.freshgo.delivery.config.StationTableShardingConfig

最后面进行绑定表,在启动的时候就可以生效

binding-tables:
        - t_station

配置文件StationTableShardingConfig

实现类PreciseShardingAlgorithm<String>,重写其中的doSharding方法。可以自定义分表策略。个人分表策略为生成的订单后三位的随机数来作为分表策略
@Slf4j
public class StationDelyItemTableShardingConfig implements PreciseShardingAlgorithm<String> {

    private static final String TABLE_PREFIX = "t_station";

    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) {
        String orgStationNo = preciseShardingValue.getValue();
        int num = Integer.parseInt(orgStationNo.substring(orgStationNo.length() - 3));
        return TABLE_PREFIX + "_" + num;
    }

此时启动项目的时候,会读到分表策略,查询的时候会自动进行分表查询,不需要在mapper中自己分表查询,按照未分表的方式就可以进行查询。

分表之后的条件查询

由于分表之后,系统默认会按照分表策略进行分表查询,如果查询的时候没有输入数字或者说输入的数字部分和自定义的分表策略,就可能会报出查不出表的sql错误。这时候就需要读取配置文件,并且在代码中进行一个格式判断。

        SpringBootShardingRuleConfigurationProperties shardingDataSource =
 ApplicationContextUtil.getBean(SpringBootShardingRuleConfigurationProperties.class);

取出配置文件中的自己的表,得到分表策略,就是配置文件中的ds${0}.t_station${0..15}  这一串,最后进行一系列的拆分获取数字,得到自己想要的判断方式,验证是否进行查询。

private Boolean checkTableNumber(String deliveryNo){
        if(deliveryNo.length()<3){
            return false;
        }
        SpringBootShardingRuleConfigurationProperties shardingDataSource = ApplicationContextUtil.getBean(SpringBootShardingRuleConfigurationProperties.class);
        String tableNumber =shardingDataSource.getTables().get("t_delivery_order").getActualDataNodes();
        String regEx="[^0-9]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(tableNumber);
        String table =m.replaceAll("");
        Integer tableQuantity = Integer.parseInt(table.replaceFirst("^0*", ""));
        if(!StringUtils.isNumeric(deliveryNo.substring(deliveryNo.length() - 3))){
            return false;
        }
        int num = Integer.parseInt(deliveryNo.substring(deliveryNo.length() - 3));
        if(num >tableQuantity){
            return false;
        }
        return true;

    }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值