主页>技术知识>详情

ShardingSphere分库必须保证两个库的表的数量与名称一致吗?

villain/2022-02-23/93阅读 /0评论
ShardingSphere分库必须保证两个库的表的数量与名称一致吗?简介:大佬见笑,最近查看分库分表的解决方案提到了ShardingSphere,于是采用ShardingSphere-jdbc来去做Demo试验一下。分了两个库,在保证两个库表的名称数量一致的情况下,可以。但

ShardingSphere分库必须保证两个库的表的数量与名称一致吗?

大佬见笑,最近查看分库分表的解决方案提到了ShardingSphere,于是采用ShardingSphere-jdbc来去做Demo试验一下。分了两个库,在保证两个库表的名称数量一致的情况下,可以。但我这有个想法,假如说。分了两个库,A库下有sys_user_0表和sys_user_1表,B库下有sys_user_0,sys_user_1,sys_role 表,即sys_user表分库分表,但是sys_role不分。然后重新配置了下sys_role的分片规则。

sys_role:
  actual-data-nodes: ds0.sys_role

因为sys_role在B表下,就只配了这么一个,打印日志显示的执行sql 只执行了B库下的sys_user_0 join sys_role和sys_user_1 join sys_role。

所以有了上面这个疑问:ShardingSphere分库必须保证两个库的表的数量与名称一致吗?

还是说我的配置有问题。下面附上yml的配置的分片规则

spring:
  main:
    allow-bean-definition-overriding: true
  application:
    name: sjdbc
  shardingsphere:
    # 属性配置
    props:
      # 是否开启 SQL 显示,默认值: false
      sql:
        show: true
    # 数据源配置,可配置多个
    datasource:
      # 本案例中配置了两个数据源,分别对应刚才创建的两个 MySQL 容器
      names: ds0,ds1
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/shardingsphere_0?useUnicode=true&characterEncoding=utf-8&serverTimezone=Hongkong&useSSL=false
        username: root
        password: '123'
        hikari:
          minimum-idle: 5
          idle-timeout: 600000
          maximum-pool-size: 10
          auto-commit: true
          pool-name: MyHikariCP
          max-lifetime: 1800000
          connection-timeout: 30000
          connection-test-query: SELECT 1
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/shardingsphere_1?useUnicode=true&characterEncoding=utf-8&serverTimezone=Hongkong&useSSL=false
        username: root
        password: '123'
        hikari:
          minimum-idle: 5
          idle-timeout: 600000
          maximum-pool-size: 10
          auto-commit: true
          pool-name: MyHikariCP
          max-lifetime: 1800000
          connection-timeout: 30000
          connection-test-query: SELECT 1
    # 分片规则配置
    sharding:
#      # 绑定表规则列表
      binding-tables: sys_user
#      # 默认数据库分片策略,同分库策略
      default-database-strategy:
        inline:
          # 分片算法行表达式,需符合 groovy 语法
          # 此处根据 time_samp  分片
          # 如果 time_samp 为奇数则落入奇数库即 ds1 匹配的数据源
          # 如果 time_samp 为偶数则落入偶数库即 ds0 匹配的数据源
          algorithm-expression: ds$->{time_samp % 2}
          # 分片列名称
          sharding-column: time_samp
      # 数据分片规则配置,可配置多个
      tables:
        # 逻辑表名称
        sys_user:
          # 由数据源名 + 表名组成,以小数点分隔
          actual-data-nodes: ds$->{0..1}.sys_user_$->{0..1}
          # 分表策略,同分库策略
          table-strategy:
            inline:
              # 此处根据 id 分片
              # 如果 id 为奇数则落入奇数表即 sys_user_1
              # 如果 id 为偶数则落入偶数表即 sys_user_0
              algorithm-expression: sys_user_$->{id % 2}
              # 分片列名称
              sharding-column: id
        sys_role:
          actual-data-nodes: ds0.sys_role

然后附上两个表的结构:

sys_user表 : id,username,time_samp

sys_role表:username,rolename

两个表通过username关联


解决方法:

加个这个配置

sharding:
  #默认数据库,所有未配置分库规则的表,都会走这里(无论是否有在tables中配置规则)
  default-data-source-name: ds0

sys_role表就会走这个数据库了

本文用户投稿或网站收集转载,如有侵权请联系本站。