Springboot 学习 之 Shardingsphere 按照日期水平分表(一)

文章目录

  • 业务场景
  • 依赖
  • 配置
  • 特别注意
  • 优劣
  • 参考资料

业务场景

报表大数据量 且需要 按照日期显示 的业务场景下,按照 日期水平分表 是一个不错的选择

依赖

	<parent>
	    <groupId>org.springframework.bootgroupId>
	    <artifactId>spring-boot-starter-parentartifactId>
	    <version>2.7.17.RELEASEversion>
	    <relativePath/> 
	parent>
    <dependency>
        <groupId>org.apache.shardingspheregroupId>
        <artifactId>shardingsphere-jdbc-coreartifactId>
        <version>5.4.1version>
    dependency>
    <dependency>
        <groupId>org.yamlgroupId>
        <artifactId>snakeyamlartifactId>
        <version>1.33version>
    dependency>

配置

bootstrap.yml

spring:
  datasource:
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    url: jdbc:shardingsphere:classpath:sharding-jdbc-config.yml

sharding-jdbc-config.yml

# 模式配置
mode:
  type: Standalone      # 单机模式
  repository:
    type: JDBC          # 存储类型
props:
  sql-show: true        # 是否打印 SQL

# 数据源配置
dataSources:
  ds0: # 数据源名称
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.jdbc.Driver
    jdbcUrl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false   # 部分数据源属性为 url
    username: root
    password: rootpassword

# 规则配置
rules:
  - !SINGLE   # 单表规则
    tables:
      - "*.*"  # 所有表
  - !SHARDING # 分片标签
    tables:   # 表规则
      DASHBOARD_CUS_DATE:   # 逻辑表名称
        actualDataNodes: ds0.DASHBOARD_CUS_DATE_$->{20250101..20991231} # 官方建议 $->{} 写法,而非 ${};起始位 20250101 对应的物理表必须存在,否则报 TABLE DON'T EXIST
        tableStrategy:      # 表策略
          standard:         # 标准分片策略
            shardingColumn: STATISTIC_DT  # 分片列
            shardingAlgorithmName: DASHBOARD_CUS_DATE_INTERVAL   # 分片算法名称
#        keyGenerateStrategy:  # 主键生成策略
#          column: ID  # 主键列
#          keyGeneratorName: snowflake   # 主键生成器名称
    defaultDataSource: ds0
    defaultDatabaseStrategy:
      none:
    defaultTableStrategy:
      none:
    shardingAlgorithms: # 分片算法
      DASHBOARD_CUS_DATE_INTERVAL:  # 分片算法名称,大小写不敏感
        type: INTERVAL  # 时间分片算法
        props:         # 分片算法属性
          datetime-pattern: 'yyyy-MM-dd'            # 时间格式
          datetime-lower: '2025-01-01'              # 起始时间
          datetime-upper: '2099-12-31'              # 结束时间
          datetime-interval-amount: 1               # 时间间隔长度
          datetime-interval-unit: 'DAYS'            # 时间间隔单位
          datetime-suffix-pattern: 'yyyyMMdd'       # 时间后缀格式

#    keyGenerators: # 主键生成器
#      snowflake:
#        type: SNOWFLAKE
#        props:
#          worker-id: 123

特别注意

  • 水平分表时,如果未配置自动分表(autoTables 标签,从 5.3.0 开始支持),最好手动将涉及的物理表都创建好,否则很可能遇到 Table doesn't exist 错误
  • 分片算法名称注意大小写,虽然原生的 shardingsphere-jdbc-core 大小写不敏感,但是你懂得…
  • 分片规则可以优化,粗暴的匹配范围太大
  • Shardingsphere 各个版本配置各有不同,告诫大家不要一味的去 “碰对的方案”

优劣

  • 优:配置拆分,清晰明了,方便维护
  • 劣:对于远程配置化项目比较麻烦

参考资料

  1. ShardingSphere 中文官网
  2. deepseek 搜索

你可能感兴趣的:(spring,boot,shardingsphere)