shardingsphere- jdbc5.3.2 怎么动态刷新 actualDataNodes

现状描述:项目启动后,根据用户操作,动态新增表,怎么可以将新增的表添加到 actualDataNodes 中

1 个赞

目前唯一的渠道是通过 Proxy 执行 DistSQL,动态修改规则。
未来我们会努力在 JDBC 中也支持 DistSQL 语句,不过这还是个远期目标,面临不少困难。

折中的办法是部署一个 Proxy 给 JDBC 访问,需要动态修改规则的 SQL,发往 Proxy 执行。

有没有办法修改规则后,自动建表?例如按月分表,我先配置了今年的,再将规则改为今年和明年,这个时候会自动创建明年的表吗

你好,我似乎也遇到了这个问题,但是我这个问题好像有些奇怪!
我使用的是自定义分表策略,通过重写StandardShardingAlgorithm类型doSharding动态的新增表和collection节点,单表可以执行任何增删改查操作不会有异常


但是连接查询将遇到问题,报子表没有配置节点,我该怎么去修改呢。

@Component
@Slf4j
public class DataShardingAlgorithm implements StandardShardingAlgorithm<Long> {


    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Long> rangeShardingValue) {
        return collection;
    }

    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {
        StringBuilder resultTableName = new StringBuilder();
        String logicTableName = preciseShardingValue.getLogicTableName();
        // 拼接的tenantId,格式为 表名_{tenant_id}
        resultTableName.append(logicTableName).append("_").append(preciseShardingValue.getValue());
        String newTableName = resultTableName.toString().toLowerCase();
        if (!collection.contains(newTableName)) {
            // 动态新增节点
            ShardingAlgorithmTool.copyTable(logicTableName,newTableName);
            collection.add(newTableName);
        }
        return newTableName;
    }
    @Override
    public String getType() {
        return null;
    }


    @Override
    public void init(Properties properties) {

    }

}
dataSources:
  testApp:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.jdbc.Driver
    jdbcUrl: jdbc:mysql://127.0.0.1:3306/app_test
    username: root
    password: 123456
rules:
  - !TRANSACTION
    defaultType: XA
    providerType: Atomikos
  - !SHARDING
    tables:
      t_member: # 分表,逻辑表名
        # 节点表添加下初始的表,后续会在新增租户的时候新增表且刷新节点
        actualDataNodes: testApp.t_member
        tableStrategy: # 配置分表策略
          standard: # 用于单分片键的标准分片场景
            shardingColumn: tenant_id
            shardingAlgorithmName: real-data-inline
      t_product: # 分表,逻辑表名
        # 节点表添加下初始的表,后续会在新增租户的时候新增表且刷新节点
        actualDataNodes: testApp.t_product
        tableStrategy: # 配置分表策略
          standard: # 用于单分片键的标准分片场景
            shardingColumn: tenant_id
            shardingAlgorithmName: real-data-inline
      t_order: # 分表,逻辑表名
        # 节点表添加下初始的表,后续会在新增租户的时候新增表且刷新节点
        actualDataNodes: testApp.t_order
        tableStrategy: # 配置分表策略
          standard: # 用于单分片键的标准分片场景
            shardingColumn: tenant_id
            shardingAlgorithmName: real-data-inline
      t_order_item: # 分表,逻辑表名
        # 节点表添加下初始的表,后续会在新增租户的时候新增表且刷新节点
        actualDataNodes: testApp.t_order_item
        tableStrategy: # 配置分表策略
          standard: # 用于单分片键的标准分片场景
            shardingColumn: tenant_id
            shardingAlgorithmName: real-data-inline
    # 分片算法配置
    shardingAlgorithms:
      real-data-inline: # 分片算法名称
        type: CLASS_BASED #自定义策略
        props:
          strategy: standard
          # 包名+类名
          algorithmClassName: com.hcyl.cloud.test.utils.DataShardingAlgorithm
    bindingTables:
      - t_member,t_product,t_order,t_order_item
props:
  sql-show: true
mode:
  type: Standalone

但是如果我把全部节点配置上 将不会出现这个异常,为什么单表似乎可以自己加载节点呢,我有其他的办法去实现这个东西吗

京ICP备2021015875号