ShardingSphere实现单库按月份分表、自动创建表、自动刷新分片节点

官网地址: https://shardingsphere.apache.org/
GitHub: https://github.com/apache/shardingsphere
官方示例:https://github.com/apache/shardingsphere/tree/master/examples
中文社区: https://community.sphere-ex.com/

背景: 项目用户数据库表量太大,对数据按月分表,需要满足如下需求:

  1. 将数据库按月分表;
  2. 自动建表;
  3. 数据自动跨表查询。

 1.maven依赖

<!-- Sharding-JDBC -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.1.0</version>
</dependency>
<!-- ShardingJDBC 5.1.0使用druid连接池需要加dbcp依赖 -->
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-dbcp</artifactId>
    <version>10.0.16</version>
</dependency>

<!-- MyBatis-Plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatisplus.version}</version>
</dependency>
<!-- Mybatis的分页插件 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

2.yml 配置

server:
  port: 8099

spring:
  ### 处理连接池冲突 #####
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    # 是否启用 Sharding
    enabled: true
    # 打印sql
#    props:
#      sql-show: true
    datasource:
      names: ds0
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://localhost:3306/szy-dev?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: root
        # 连接池的配置信息
        # 初始化大小,最小,最大
        initial-size: 5
        min-idle: 5
        maxActive: 100
        # 配置获取连接等待超时的时间
        maxWait: 10000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
    rules:
      sharding:
        # 表策略配置
        tables:
          # sys_user_behavior 是逻辑表
          sys_user_behavior:
            # 配置数据节点,这里是按月分表
            # 示例1:时间范围设置在202201 ~ 210012
            # actualDataNodes: mydb.t_user_$->{2022..2100}0$->{1..9},mydb.t_user_$->{2022..2100}1$->{0..2}
            # 示例2:时间范围设置在202201 ~ 202203
            actualDataNodes: ds0.sys_user_behavior_$->{2023..2030}0$->{1..9},ds0.sys_user_behavior_$->{2023..2030}1$->{0..2}
            tableStrategy:
              # 使用标准分片策略
              standard:
                # 配置分片字段
                shardingColumn: create_time
                # 分片算法名称,不支持大写字母和下划线,否则启动就会报错
                shardingAlgorithmName: time-sharding-algorithm
        # 分片算法配置
        shardingAlgorithms:
          # 分片算法名称,不支持大写字母和下划线,否则启动就会报错
          time-sharding-algorithm:
            # 类型:自定义策略
            type: CLASS_BASED
            props:
              # 分片策略
              strategy: standard
              # 分片算法类
              algorithmClassName: com.demo.module.config.sharding.TimeShardingAlgorithm
#  datasource:
#    druid:
#      stat-view-servlet:
#        enabled: true
#        loginUsername: admin
#        loginPassword: 123456
#        allow:
#      web-stat-filter:
#        enabled: true
#    dynamic:
#      druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)
#        # 连接池的配置信息
#        # 初始化大小,最小,最大
#        initial-size: 5
#        min-idle: 5
#        maxActive: 100
#        # 配置获取连接等待超时的时间
#        maxWait: 10000
#        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
#        timeBetweenEvictionRunsMillis: 60000
#        # 配置一个连接在池中最小生存的时间,单位是毫秒
#        minEvictableIdleTimeMillis: 300000
#        validationQuery: SELECT 1
#        testWhileIdle: true
#        testOnBorrow: false
#        testOnReturn: false
#        # 打开PSCache,并且指定每个连接上PSCache的大小
#        poolPreparedStatements: true
#        maxPoolPreparedStatementPerConnectionSize: 20
#        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
#        filters: stat,wall,slf4j
#        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
#        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
#      datasource:
#        master:
#          url: jdbc:mysql://localhost:3306/szy-dev?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
#          username: root
#          password: root
#          driver-class-name: com.mysql.cj.jdbc.Driver
#          # 多数据源配置
#          #multi-datasource1:
#          #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
#          #username: root
#          #password: root
#          #driver-class-name: com.mysql.cj.jdbc.Driver

# mybatis-plus
mybatis-plus:
  mapper-locations: classpath*:/mapper/*Mapper.xml
  # 实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.demo.*.entity
  # 测试环境打印sql
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

pagehelper:
  helperDialect: postgresql

3.TimeShardingAlgorithm.java 分片算法类

package com.demo.module.config.sharding;

import com.demo.module.config.sharding.enums.ShardingTableCacheEnum;
import com.google.common.collect.Range;
import lombok.extern.slf4j.Slf4j;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值