关于Inline语法

          tbSendRcd:
            actualDataNodes: database_$->{0..1}.table_$->{[20220101,20220102,20220103]}
            table-strategy:
              standard:
                sharding-algorithm-name: default-date-algorithms
                sharding-column: id

像这种按天分片。我要配置一年的节点,太多了。有没有什么简单的方法?或者有没有关于Inline语法的文档?我在网上并没有找到相关的文档

inline? 按天分表? 时间区间划分的话有内置的.

@泠恒谦 我不是说的分片算法哦,我说的是分片节点
这个

  • 如果真是365天,我更鼓励用contextmanager动态更新。(如果是 Shardingsphere Proxy,我觉得我没必要介绍DistSQL语法,因为那太简单了)
  • 你需要有个方法来生成actualdatanode的string。
public class LocalShardingDatabasesAndTablesUtil { 
     public static String getActualDataNodes() { 
         LocalDate startTime = LocalDate.now().minusDays(365); 
         LocalDate endTime = LocalDate.now(); 
         return LongStream.range(0, ChronoUnit.DAYS.between(startTime, endTime)) 
                 .mapToObj(startTime::plusDays) 
                 .map(localDate -> "table_name_" + localDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"))) 
                 .collect(Collectors.joining(",")));
     }
}
  • 我必须指出这只是个单元测试,用JDK8在道德上是不优越的,JDK9之后有内置的DateUtil
  • 然后学 how to config actual-data-nodes while my actual-data-nodes tables is dynamic。 · Issue #16725 · apache/shardingsphere · GitHub 注入ShardingSphere的数据源,做个更新方法,使用Spring的ApplicationRunner or CommandLineRunner启动时执行一下解决。(Quarkus或JakartaMVC的类似类我不提了)
  • 鬼故事是Groovy 就可以调java的静态方法或静态变量,这意味着你在yaml内actualdatanode用groovy表达式调个list<string>也是有手就行的事情。但我在社群里对这种用法有过争论,怀疑ShardingSphere初始化后继续解析的方法不太妥,但苦逼的是我写不出一个失败的单元测试。:rofl:

@泠恒谦 我刚刚测试了一下,就算我配置的节点跟实际的节点不匹配,还是能查出数据的。
例如:
版本:5.1.1
配置的节点:{20220601…20220605}
实际的节点:{20220601…20220613}
通过分片算法,落到的节点在20220613上。没有报错,数据也能查出来。
那这个配置的节点似乎好像没什么用?

补充一下:以上面的例子,如果我配置的节点是{20220601…20220630}。则会在查询的时候报错

你需要提供更多的信息,最好是一个能复现的单元测试。查询是进入对应算法后再从actualdatanodes取的。因此你不应该配置不存在的表。

通过contextManager只能全量更新而不是增量更新?

你如何定义增量更新…?规则改变在当前情形下对应着一次zookeeper规则节点的更新,那个节点又没有子节点

京ICP备2021015875号