当前位置: 首页 > news >正文

Springboot3 + shardingsphere-jdbc5.5.2 按年月分表(动态创建表)

1、使用 shardingsphere 动态创建刷新节点

(这个方式 在最新5.3以上的版本已经不支持自定义动态刷新actualDataNodes节点了。

,但是我又不想一次创建所有表(说不定什么时候就会修改表结构)那么该怎么搞呢,我这里提供一个曲线方案。

2、任务创建下一年的表。

原始表用来复制创建

任务类

/** * 开启拉取任务(Bean模式)以年为单位创建 每年最后一天创建下一年的表 */ @XxlJob("createMessageTableJobHandler") public void createMessageTableJobHandler() throws Exception { Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy"); String s = format.format(date); // 创建下一年的表 Integer data = Integer.parseInt(s) + 1; // 一次性创建连续两年的表 for (MessageCreatTableEnum value : MessageCreatTableEnum.values()) { StringBuffer name1 = new StringBuffer(value.getCode() + StringPool.UNDERSCORE + data) ; StringBuffer name2= new StringBuffer(value.getCode() + StringPool.UNDERSCORE + (data+1)) ; createTable(value, name1.toString(),name2.toString()); } System.out.println(1); } /** * 创建指定年的分片 * @param value * @param table * @param tableNext */ private void createTable(MessageCreatTableEnum value, String table, String tableNext){ try { Connection connection = dataSource.getConnection(); Statement st = connection.createStatement(); st.setQueryTimeout(10); // 使用st.execute 会卡死 st.executeUpdate 虽然会报错 但是他会执行创建表sql 不影响功能 st.executeUpdate("CREATE TABLE IF NOT EXISTS `" + table + "` LIKE `" + value.getCode() + "`;" + "CREATE TABLE IF NOT EXISTS `" + tableNext + "` LIKE `" + value.getCode() + "`;"); } catch (SQLException e) { log.error(">>>>>>>>>> 这里本来就会抛异常 但是不影响 创建sql执行:{}", e.getMessage(), e); } }

3、sharding-jdbc-dev.yaml 配置

dataSources: master: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://127.0.0.1:3306/sms?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false username: root password: 123456 connectionTimeout: 30000 idleTimeout: 600000 maxLifetime: 1800000 maximumPoolSize: 10 minimumIdle: 5 rules: ### 数据库读写分离配置 - !READWRITE_SPLITTING dataSourceGroups: ### 读写数据库别名 master_ds: writeDataSourceName: master readDataSourceNames: - master transactionalReadQueryStrategy: PRIMARY loadBalancerName: random #负载均衡算法轮询 loadBalancers: random: type: RANDOM #单表配置 - !SINGLE tables: - master_ds.* defaultDataSource: master_ds
- !SHARDING tables: message_data: actualDataNodes: master_ds.message_data_$->{2025..2100} tableStrategy: standard: shardingColumn: create_time shardingAlgorithmName: message_data_year shardingAlgorithms: message_data_year: type: INTERVAL props: datetime-pattern: "yyyy-MM-dd HH:mm:ss" ## 设置分片开始时间 datetime-lower: "2025-01-01 00:00:00" ## 设置分片结束时间 datetime-upper: "2100-12-31 23:59:59" sharding-suffix-pattern: "yyyy" datetime-interval-amount: 1 datetime-interval-unit: YEARS
props: sql-show: true

4、如何命中分片测试(关键点)

由于我们超前配置了分片表(到2100年)但是数据库并没有生成这个些表。每次操作如果没有命中分片字段策略,会检索所有表,报异常。

所以在每次保存 查询操作的时候一定要传递(create_time)字段值。

用来命中分片规则,如果不传递会默认查询原始表。

以mybatis为例

保存必须床底分片字段

查询 设置分片范围 比如id查询为例 除了传递id 还要传递时间 用来命中指定分片。

如果懒可以,直接 lt 当前时间(这个会查询比当前时间小的所有表,查询多次库,性能差点)

http://www.cnnetsun.cn/news/68098.html

相关文章:

  • 豆包手机助手回应“获取受保护内容”质疑;京东招募端侧AI芯片人才:月薪25K-100K;iOS26出现离奇Bug | 极客头条
  • PHP 8.6性能监控从入门到精通(仅限高级工程师掌握的技术细节)
  • Qt 6 高性能 RTP 实时音频流监听、解码、丢帧播放与波形可视化架构研究报告
  • TeleTron项目技术优化原理之上下文并行技术
  • Simulink上四永磁同步电机偏差耦合转速同步控制仿真模型的设计与实现
  • 生成式深度学习(文本生成)
  • 39、gawk 扩展:文件函数的实现与应用
  • 40、深入了解gawk扩展功能与编程接口
  • 为什么你的Rust-PHP扩展无法运行?:一文搞懂ABI兼容与PHP模块版本映射
  • 42、《gawk安装与使用全指南》
  • 如何通过AI销冠系统,实现数字员工效率的质变?
  • 兼容性双突破,低门槛部署实测!IPTV 电视源码系统 2025
  • plsql提示款报错乱码
  • 为什么Laravel 13的多模态存储设计让90%的开发者拍案叫绝?
  • 【计算机毕设选题】基于Spark的公务员招录职位信息可视化分析系统源码,Python大数据项目 毕业设计 选题推荐 毕设选题 数据分析 机器学习
  • 如何利用微信个人号API接口进行二次开发?
  • Symfony 8服务注册中心性能优化指南(提升响应速度300%)
  • 3、CentOS 7 入门:Bash shell 与文件系统导航
  • 2025年低成本提升AI能力:CAIE认证的高性价比之选
  • 2025应届生AI证书避坑指南:CAIE认证成优选
  • 如何利用PHP 8.6的JIT指令优化实现毫秒级响应?
  • 【Symfony 8路由安全进阶指南】:掌握参数验证的5大核心技巧
  • 从传感器到图表:PHP实现农业数据实时可视化的5个关键步骤
  • 业务导向型技术日志首日记录(业务中使用的技术栈)
  • 基于SpringBoot + Vue的宠物殡葬网站设计
  • 基于Uniapp + SpringBoot + Vue的中医个性化养生系统的设计与实现
  • 亲测有效:打印机驱动程序无法使用的完整解决思路
  • ollama pull qwen:32b命令执行失败原因排查
  • 基于Uniapp + SpringBoot + Vue的高校就业招聘系统的设计与实现
  • Qwen3-32B适合哪些行业?金融、医疗、法律应用场景解析