当前位置:   article > 正文

sharding-jdbc 学习 2_rangeshardingvalue 分片算法不生效

rangeshardingvalue 分片算法不生效

接着上一篇,InlineShardingStrategyConfiguration不支持范围分片操作。看看文档

选用StandardShardingStrategy 标准分片策略。

修改原来的分库分表策略代码:

  1. // 配置分库 + 分表策略
  2. //orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}"));
  3. //orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}"));
  4. //替换为StandardShardingStrategyConfiguration分片策略
  5. orderTableRuleConfig.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id",
  6. new PreciseShardingAlgorithm() {
  7. //collection 就是实际库的集合,preciseShardingValue是 逻辑表 和 字段名 和 分片健(这里的user_id)的值
  8. @Override
  9. public String doSharding(Collection collection, PreciseShardingValue preciseShardingValue) {
  10. return null;
  11. }
  12. }, new RangeShardingAlgorithm() {
  13. @Override
  14. public Collection<String> doSharding(Collection collection, RangeShardingValue rangeShardingValue) {
  15. return null;
  16. }
  17. }));

断点调试下:

  1. 对于等值查询执行 PreciseShardingAlgorithm()
  2. 范围查询执行 RangeShardingAlgorithm()
  3. 可以看出,collection 就是实际库的集合,preciseShardingValue是 逻辑表 和 字段名 和 分片健(这里的user_id)

修改后的配置:

  1. // 配置分库 + 分表策略
  2. //orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}"));
  3. //orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}"));
  4. //替换为StandardShardingStrategyConfiguration分片策略
  5. //PreciseShardingAlgorithm是必选的,用于处理=和IN的分片
  6. //collection 就是实际库的集合,preciseShardingValue是 逻辑表 和 字段名 和 分片健(这里的user_id)
  7. //RangeShardingAlgorithm是可选的,用于处理BETWEEN AND, >, <, >=, <=分片
  8. //分库策略
  9. orderTableRuleConfig.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id",
  10. (PreciseShardingAlgorithm<Long>) (collection, preciseShardingValue) -> {
  11. //这里返回 满足条件的一个库。按照原来user_id % 2的方式,就应该是这样
  12. Long currentUserId = preciseShardingValue.getValue();
  13. long result = currentUserId % 2;
  14. //过滤出以取模结果结尾的库
  15. return collection.stream().filter(dbName -> dbName.endsWith(String.valueOf(result))).findFirst().get();
  16. }, (collection, rangeShardingValue) -> {
  17. //根据user_id % 2的方式确定不了具体范围,直接返回所有库
  18. return collection;
  19. }));
  20. //分表策略
  21. orderTableRuleConfig.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id",
  22. (PreciseShardingAlgorithm<Long>) (collection, preciseShardingValue) -> {
  23. //也按照原来user_id % 2的方式
  24. Long currentUserId = preciseShardingValue.getValue();
  25. long result = currentUserId % 2;
  26. return collection.stream().filter(dbName -> dbName.endsWith(String.valueOf(result))).findFirst().get();
  27. }, (collection, rangeShardingValue) -> {
  28. return collection;
  29. }));

全局搜索下日志配置:

配置日志打印:

执行测试方法:范围查询    select * from `t_order` where user_id > #{id}    3

查看打印sql:

范围查询,返回的全部数据库,所以查询全库全表。

再看等值查询:select * from `t_order` where user_id = #{id}  3

等值查询执行的:取模判断返回的数据库。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/756678
推荐阅读
相关标签
  

闽ICP备14008679号