首页 > 其他分享 >springboot集成shardingjdbc

springboot集成shardingjdbc

时间:2024-10-30 11:44:02浏览次数:4  
标签:集成 springboot dateTime current LocalDateTime sharding shardingjdbc class String

1、引入POM

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

2、修改yml配置

spring:
  shardingsphere:
    props:
      sql:
        #打印sql
        show: true
    datasource:
      names: ds1       #指定一个虚拟数据库名称
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://47.99.80.195:3306/bridge_monitor?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true
        username: root
        password: neIIqlwGsjsfsA6uxNqD
    #分表配置, 这里使用主键cid 作为分表字段
    sharding:
      tables:
        plat_ais_track:    #指定一个虚拟表名称
          actual-data-nodes: ds1.plat_ais_track_$->{202403..202404}, ds1.plat_ais_track_$->{202501..202504}
          key-generator:        #主键自动生成策略
            column: point_id
            type: SNOWFLAKE     #使用雪花ID
            props:
              worker:
                id: 1
          table-strategy:       #分表策略
            standard:             #standard策略
              sharding-column: lastdyn      #分表字段
              precise-algorithm-class-name: com.nuorui.framework.sharding.algorithm.QuarterlyShardingAlgorithm    #分表算法,求模取余算法
              range-algorithm-class-name: com.nuorui.framework.sharding.algorithm.QuarterlyRangeShardingAlgorithm

3、分表算法

public class QuarterlyRangeShardingAlgorithm implements RangeShardingAlgorithm<LocalDateTime> {

    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<LocalDateTime> shardingValue) {
        Set<String> result = new HashSet<>();
        LocalDateTime startTime = shardingValue.getValueRange().lowerEndpoint();
        LocalDateTime endTime = shardingValue.getValueRange().upperEndpoint();

        LocalDateTime current = startTime;
        while (!current.isAfter(endTime)) {
            int year = current.getYear();
            int quarter = (current.getMonthValue() - 1) / 3 + 1;
            String tableSuffix = String.format("%d0%d", year, quarter);

            availableTargetNames.stream()
                    .filter(tableName -> tableName.endsWith(tableSuffix))
                    .findFirst()
                    .ifPresent(result::add);
            // 正确移动到下一个季度的开始
            current = moveToNextQuarter(current);
        }
        return result;
    }

    private LocalDateTime moveToNextQuarter(LocalDateTime dateTime) {
        // 获取当前季度的最后一天
        LocalDateTime endOfQuarter = dateTime.with(IsoFields.DAY_OF_QUARTER, dateTime.range(IsoFields.DAY_OF_QUARTER).getMaximum());
        // 移动到下一天,即下一季度的第一天
        return endOfQuarter.plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
    }
}
public class QuarterlyShardingAlgorithm implements PreciseShardingAlgorithm<LocalDateTime> {

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<LocalDateTime> shardingValue) {
        LocalDateTime dateTime = shardingValue.getValue();
        int year = dateTime.getYear();
        int quarter = (dateTime.getMonthValue() - 1) / 3 + 1;

        String tableSuffix = String.format("%d0%d", year, quarter);

        return availableTargetNames.stream()
                .filter(tableName -> tableName.endsWith(tableSuffix))
                .findFirst()
                .orElseThrow(() -> new IllegalStateException("No table found for date: " + dateTime));
    }
}

 

标签:集成,springboot,dateTime,current,LocalDateTime,sharding,shardingjdbc,class,String
From: https://www.cnblogs.com/fangts/p/18515546

相关文章

  • SpringBoot社区服务平台的设计与实现jm6z2(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表居民,活动类型,社区活动,活动报名,取消报名,新闻类别,社区新闻,优秀活动,水电费,缴费提醒,隔离采购,采购情况开题报告内容一、课题背景与意义随着信息技术的飞......
  • SpringBoot山猫体育新闻网y5ejn(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,球队信息,比赛赛程,球员信息,精彩视频,比赛结果,篮球资讯开题报告内容一、课题名称山猫体育新闻网的设计与实现二、研究背景与意义随着互联网技术的飞......
  • SpringBoot人事管理912fw(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表部门,员工,考勤信息,工资发放,员工请假,加班登记,迟到登记,培训信息,报名信息,文档档案,签到信息开题报告内容一、项目背景随着企业规模的扩大,人事管理变得日......
  • Springboot小程序相关
    记录一些与小程序相关的内容,例如登录,发送订阅消息等1.登录相关1.1.获取openid/***code:由小程序生成*appid:小程序id*secret:密钥**/publicStringgetOpenid(Stringcode){Stringdata="appid="+appid+"&"+"secret="+secret+......
  • 【项目实战】远程信息处理控制单元(TCU),集成了多种通信技术,如蜂窝网络、Wi-Fi、蓝牙等,使
    一、TCU是什么?TCU,远程信息处理控制单元(TelematicsControlUnit)TCU,是车辆中用于实现远程信息处理功能的关键组件。TCU,集成了多种通信技术,如蜂窝网络、Wi-Fi、蓝牙等,使得车辆能够与外部系统进行数据交换和通信。二、TCU支持的各种应用和服务TCU,在车联网中扮演着重要角色......
  • 【毕业设计】基于SpringBoot + Vue的物资综合管理系统
    现代企业管理中,如何高效地进行物资管理,确保数据的准确性和安全性,是一项重要的需求。传统的手工管理方式不仅耗时,还容易出错,无法满足信息化时代的高效要求。本文探讨了一种基于Java开发的物资综合管理系统,旨在提供一套高效、可靠的物资管理解决方案。一、项目背景与意义在信息......
  • 【毕业设计】基于SpringBoot + Vue的国产动漫网站
    在互联网与动漫产业迅速发展的今天,越来越多的用户期待能在专业网站上获取最新、最全的国产动漫信息。基于这一需求,本文档详细介绍了一个国产动漫网站的设计与实现过程。该项目通过Java语言和MySQL数据库构建,实现了用户与动漫资源间的互动,旨在为国产动漫爱好者提供一站式的信息......
  • 小白手把手教学怎么用maven创建一个Springboot项目
    spring_boot⼀个使⽤了SpringBoot的项⽬⼯程,本质上来说和只使⽤SpringFramework的⼯程是⼀样的,如果使⽤Maven来管理,那它就是个标准的Maven⼯程,⼤概的结构就像下⾯这样。|-pom.xml|-src|-main|-java|-resources|-test|-java|-......
  • 揭秘 SpringBoot AOP:让你的代码更优雅、更高效
    引言在现代软件开发中,编写高效、可维护的代码是每个开发者的追求。SpringBoot作为一个强大的开发框架,不仅仅提供了快速开发的能力,还通过AOP(面向切面编程)让开发者能够以更优雅的方式处理横切关注点。本文将深入探讨SpringBootAOP的原理、应用场景以及如何通过AOP让你的......
  • Java毕业设计-基于Springboot框架的文学创作类社交论坛系统项目实战(附源码+论文)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......