Shardingsphere分表

Shardingsphere 4

1. 依赖

<dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>

2. yml配置

spring:
  main:
  shardingsphere:
    datasource:
    #数据库名称 可配置多个 
      names: db0
      db0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:1111/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useAffectedRows=true&serverTimezone=Asia/Shanghai&useSSL=false
        username: root
        password: 111
        #最大连接数
        max-connections-size-per-query: 20
        filters: stat
        initial-size: 1
        max-active: 10
        max-open-prepared-statements: 10
        max-wait: 60000
        min-evictable-idle-time-millis: 300000
        min-idle: 1
        pool-prepared-statements: true
        test-on-borrow: false
        test-on-return: false
        test-while-idle: true
        time-between-eviction-runs-millis: 60000
        validation-query: select 'x'
        filter:
          # 开启druiddatasource的状态监控
          stat:
            enabled: true
            db-type: mysql
            # 开启慢sql监控,超过2s 就认为是慢sql,记录到日志中
            log-slow-sql: true
            slow-sql-millis: 1000
          # 日志监控,使用slf4j 进行日志输出
        stat-view-servlet:
          enabled: true
          url-pattern: /druid/*
          reset-enable: true
          login-username: root
          login-password: root
          allow: 127.0.0.1
    sharding:
      default-data-source-name: db0
      tables:
      #逻辑表名称
        order:
        # 分表策略
          actual-data-nodes: db0.order_$->{0..1}
          table-strategy:
          #使用内联分片策略
            inline:
            #分片列名称
              sharding-column: id
              #分片算法表达式
              algorithm-expression: order_$->{id % 2}
    enabled: true
    props:
      sql:
      #日志打印
        show: true      

3.问题点

3.1 加载慢(元数据加载整个库)

日志:

2024-03-12 10:27:31.986 [main] INFO ShardingSphere-metadata - Loading 1 logic tables' meta data.
2024-03-12 10:27:33.014 [main] INFO ShardingSphere-metadata - Loading 354 tables' meta data.
2024-03-12 10:27:38.776 [main] INFO ShardingSphere-metadata - Meta data load finished, cost 6831 milliseconds.

原因:

  • 由于配置中只配置了一个数据源,ShardingSphere会默认将这个数据源当做默认数据源,可以看到我的配置里面是没有配置default-data-source-name这个配置的,而ShardingSphere加载默认数据源的表是全库的表都加载的,即是日志上看到的加载了354个表。就是因为其将我配置的那个数据源当做了默认数据源,导致加载了6831 milliseconds

解决:

多引入一个数据源,可以与之前的数据源相同或不同

且不配置默认数据源 spring.shardingsphere.sharding.default-data-source-name则不会加载整个库的元数据

3.2 Time格式转换

引入依赖即可

<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-typehandlers-jsr310</artifactId>
            <version>1.0.1</version>
        </dependency>

Shardingsphere 5

1. 依赖

    <!--  分表依赖      -->
<dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core</artifactId>
            <version>5.4.0</version>
        </dependency>
    <!--  解析yaml      -->
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.33</version>
        </dependency>

官方文档参考:文档

2.引入流程

3. yml配置

databaseName: db0
# 数据源配置
dataSources:
  db0:
    # 数据库连接池类名称
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    # 数据库驱动类名
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://191.161.1.151:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useAffectedRows=true&serverTimezone=Asia/Shanghai&useSSL=false
    username: root
    password: qqqqqqqq
    druid:
      filters: stat
      initial-size: 1
      max-active: 10
      max-open-prepared-statements: 10
      max-wait: 60000
      min-evictable-idle-time-millis: 300000
      min-idle: 1
      pool-prepared-statements: true
      test-on-borrow: false
      test-on-return: false
      test-while-idle: true
      time-between-eviction-runs-millis: 60000
      validation-query: select 'x'
      filter:
        # 开启druiddatasource的状态监控
        stat:
          enabled: true
          db-type: mysql
          # 开启慢sql监控,超过2s 就认为是慢sql,记录到日志中
          log-slow-sql: true
          slow-sql-millis: 1000
        # 日志监控,使用slf4j 进行日志输出
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: true
        login-username: root
        login-password: root
        allow: 191.166.1.111
# 规则配置
rules:
- !SINGLE
  tables:
    - "*.*" # 加载全部单表
- !SHARDING
  tables:
    # 逻辑表名称
    b_order:
      # 行表达式标识符可以使用 ${...} 或 $->{...},但前者与 Spring 本身的属性文件占位符冲突,因此在 Spring 环境中使用行表达式标识符建议使用 $->{...}
      actualDataNodes: db0.b_order_$->{0..1}
      # 分表策略
      tableStrategy:
        standard:
          # 分片列名称
          shardingColumn: user_id
          # 分片算法名称
          shardingAlgorithmName: orderTableInline
      keyGenerateStrategy:
        column: id
        keyGeneratorName: snowflake
  # 分片算法配置
  shardingAlgorithms:
    orderTableInline:
      type: INLINE
      props:
        algorithm-expression: b_order_$->{user_id % 2}
  keyGenerators:
    snowflake:
      type: SNOWFLAKE
# 属性配置
props:
  # 展示修改以后的sql语句
  sql-show: true

4.JDBC驱动

spring:
  datasource:
    # 指定 YAML 配置文件
    url: jdbc:shardingsphere:classpath:sharding.yaml
    # 配置 DataSource Driver
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver

5.问题

5.1 java.lang.NoSuchMethodError: org.apache.shardingsphere.infra.util.yaml.constructor.ShardingSphereYamlConstructor$1.setCodePointLimit(I)V

<dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.33</version>
        </dependency>

5.2 加载配置报错Unable to find property 'databaseName (db0)' on class: org.apache.shardingsphere.driver.api.yaml.YamlJDBCConfiguration

org.yaml.snakeyaml.constructor.ConstructorException: Cannot create property=rules for JavaBean=org.apache.shardingsphere.infra.yaml.config.pojo.YamlRootConfiguration@74525630
in 'reader', line 1, column 1:
dataSources:

原因:yaml校验严格,yaml文件内配置项 有错误

可能属性配置名称有误 或 驼峰问题

5.3 java.sql.SQLException: url not set

配置的连接池

HikariDataSource是jdbcUrl,而druid是url

5.4 snowflake algorithm does not exist in

策略里面没有配置分布式序列算法配置

5.5 ERROR Cause: java.sql.SQLException: Table 'order' doesn't exist

表分片策略配置不完整 如:其他不需要分表的表没有加入到shardingsphere管理

5.6配置注册中心不支持

6.读取注册中心nacos

基于实现读取配置类源码

创建factory文件 进行读取对应的配置信息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容