sharding-jdbc 如何单独使用auto-tables,官方文档里面也没有找到具体配置

看了 “ 分片利器 AutoTable:为用户带来「管家式」分片配置体验”这篇文章,文章中说适用于sharding-jdbc


文章中对sharding-jdbc使用auto-tables如下描述

配置规则yaml如下:

    rules:
      sharding:
        auto-tables:
          t_order:
            actual-data-sources: test$->{0..2}
            key-generate-strategy:
              column: order_id
              key-generator-name: snowflake
            sharding-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: mod
        key-generators:
          snowflake:
            type: MY_SNOWFLAKE2
        sharding-algorithms:
          mod:
            type: MOD
            props:
              sharding-count: 6

create table语句是怎样的呢,和普通create table一样吗?create table如何执行呢,客户端工具还是API方式呢?

  • 建表事实上是额外执行的,并不在 ShardingSphere 的虚拟数据源中操作。
  • 而且auto-tables 也没 actual-data-sources 属性。

actual-data-sources有这个属性额

“建表事实上是额外执行的,并不在 ShardingSphere 的虚拟数据源中操作”你的意思是像原来操作数据库一样 通过客户端工具执行create table语句吗

的确是通过客户端工具执行的,建资源需要额外的DistSQL。ShardingSphere的master分支我测过还没加上自动建不存在的表吧。

咦,master分支加回 actual-data-sources 吗?我上一次测 auto tables 还是5.0.0,不太确定。

我用的是5.1.1

示例配置在 shardingsphere/application-sharding-auto-tables.properties at master · apache/shardingsphere (github.com) ,不过我的确没测过带 actual-data-sources 的,以前是自动配置。你可以对着CI测的Example来看。他实际只要求存在序列从1开始,步增为1的表已存在即可,比如tb_order_$->{1…1000}.

这个配置我也看到过,我在yaml文件里面也进行了如此配置。但是create table的创建让我不是很明白

shardingsphere在数据分片这个过程只起到调控资源的作用。创表的过程是需要你在实际的数据源上创的。即你需要预先创表。起码目前还没有根据shardingsphere的contextmanager自动建不存在的表的特性。

CI那个example是在启动的时候预先为h2database 2.x初始化了表结构和表数据。

我问了一下官方,已经成功了。
yaml配置

  spring:
  application:
    name: mp
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      names: test0,test1,test2
      test0:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://xxx:xxx/autotables1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=CST
        username: root
        password: xxx
        type: com.zaxxer.hikari.HikariDataSource
      test1:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://xxx:xxx/autotables2?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=CST
        username: root
        password: xxx
        type: com.zaxxer.hikari.HikariDataSource
      test2:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://xxx:xxx/autotables3?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=CST
        username: root
        password: xxx
        type: com.zaxxer.hikari.HikariDataSource
    rules:
      sharding:
        auto-tables:
          t_order:
            actual-data-sources: test$->{0..2}
            key-generate-strategy:
              column: order_id
              key-generator-name: snowflake
            sharding-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: mod
        key-generators:
          snowflake:
            type: MY_SNOWFLAKE2
        sharding-algorithms:
          mod:
            type: MOD
            props:
              sharding-count: 6
    props:
      sql-show: true

通过sharding-proxy或者通过JDBC API执行create table语句,create table 是逻辑SQL

  @Test
    public void testInsertOrder() {
        jdbcTemplate.execute("CREATE TABLE `t_order` (\n" +
                " `order_id` bigint(20) NOT NULL COMMENT '订单id',\n" +
                " `price` decimal(10,2) NOT NULL COMMENT '订单价格',\n" +
                " `user_id` bigint(20) NOT NULL COMMENT '下单用户id',\n" +
                " `status` varchar(50) NOT NULL COMMENT '订单状态',\n" +
                " PRIMARY KEY (`order_id`) USING BTREE\n" +
                ") ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;");
        Random random = new Random();
        for (int i = 1; i < 10; i++) {
            TOrder1 order = new TOrder1();
            order.setPrice(new BigDecimal(i));
            order.setUserId(Integer.valueOf(random.nextInt(25)).longValue());
            order.setStatus(i + "");
            orderDao.insertOrder(order);
        }
    }

sharding-jdbc会自动帮我们创建表,下面表都是自动创建

auto table 使用 actual-data-sources,指定要使用哪些数据源;
table 使用 actual-data-nodes,指定表分布的节点;

无论哪种方式,配置规则后都要单独执行 CREATE TABLE 语句创建真实表。

1 个赞
京ICP备2021015875号