springboot通过sharding-dbc按年、月分片
目录
springboot通过sharding-dbc按年、月分片
1、引入pom依赖
2、application.yml配置
3、分片算法
4、注意事项
1、引入pom依赖
<!--shardingjdbc分片,和Druid不兼容,如果不使用sharding则需要注释--><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency>
2、application.yml配置
spring:autoconfigure:exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfiguremain:allow-bean-definition-overriding: trueshardingsphere:#配置数据源datasource:names: ds-masterds-master:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://147.1.5.229:3306/aihosp?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=trueusername: aihosppassword: DF3f3#KF#83Fesharding:tables:year_table:actual-data-nodes: ds-master.year_table$->{2021..2025} #按年分表tableStrategy:standard: #用于单分片键的标准分片场景sharding-column: create_dateprecise-algorithm-class-name: com.gxfy.common.algorithm.PreciseRangeShardingAlgorithm # 精确分片算法类名称,用于=和IN。该类需实现PreciseShardingAlgorithm接口并提供无参数的构造器range-algorithm-class-name: com.gxfy.common.algorithm.PreciseRangeShardingAlgorithm #范围分片算法类名称,用于BETWEEN,可选。该类需实现RangeShardingAlgorithm接口并提供无参数的构造器key-generator:column: idtype: SNOWFLAKE #分布式全局ID(雪花算法)retry-interval-milliseconds: 500month_table:actual-data-nodes: ds-master.month_table$->{2022..2025}0$->{1..9},ds-master.month_table$->{2022..2025}1$->{0..2} #按月分表tableStrategy:standard: #用于单分片键的标准分片场景sharding-column: create_dateprecise-algorithm-class-name: com.gxfy.common.algorithm.PreciseRangeShardingAlgorithmrange-algorithm-class-name: com.gxfy.common.algorithm.PreciseRangeShardingAlgorithmkey-generator:column: idtype: SNOWFLAKE #分布式全局ID(雪花算法)retry-interval-milliseconds: 500)retry-interval-milliseconds: 500#其他运行属性props:sql:show: false
3、分片算法
import com.google.common.collect.Range;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;/**** 按年分片* 精准分库PreciseShardingDBAlgorithm** 范围分库RangeShardingDBAlgorithm** 精准分表PreciseShardingTableAlgorithm** 范围分表RangeShardingTableAlgorithm:*/
@Slf4j
public class PreciseRangeShardingAlgorithm implements PreciseShardingAlgorithm<String>,RangeShardingAlgorithm<String> {/*** RangeShardingAlgorithm的重写 根据传入的分片健的值,对所有待选择的表中 根据自己的业务逻辑进行判断,选择符合条件的表返回* @param tableNameList 返回需要查询的表* @param shardingValue 传入的分片健的值* @return 返回符合条件的表名称*/@Overridepublic Collection<String> doSharding(Collection<String> tableNameList, RangeShardingValue<String> shardingValue) {System.out.println("[MyTableRangeShardingAlgorithm] shardingValue: [{}]\n"+ shardingValue);Set<String> tableNameResultList = new LinkedHashSet<>();Range<String> rangeValue = shardingValue.getValueRange();String flag = "year";for (String tableName : tableNameList) {if (tableName.startsWith("month_table")) {flag = "month";break;}}if ("year".equals(flag)) {int lowInt = Integer.parseInt(rangeValue.lowerEndpoint().substring(0,5).replaceAll("-",""));int upperInt = Integer.parseInt(rangeValue.upperEndpoint().substring(0,5).replaceAll("-",""));for (String tableNameItem : tableNameList) {String substring = tableNameItem.substring(tableNameItem.length() - 4);int tableItem = Integer.valueOf(substring);if(tableItem >= lowInt && tableItem <= upperInt ){tableNameResultList.add(tableNameItem);}}} else if ("month".equals(flag)) {int lowInt = Integer.parseInt(rangeValue.lowerEndpoint().substring(0,7).replaceAll("-",""));int upperInt = Integer.parseInt(rangeValue.upperEndpoint().substring(0,7).replaceAll("-",""));for (String tableNameItem : tableNameList) {String substring = tableNameItem.substring(tableNameItem.length() - 6,tableNameItem.length());int tableItem = Integer.valueOf(substring);if(tableItem >= lowInt && tableItem <= upperInt ){tableNameResultList.add(tableNameItem);}}}return tableNameResultList;}/** PreciseShardingAlgorithm的重写 */@Overridepublic String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) {String s = buildShardingTable(preciseShardingValue.getLogicTableName(), preciseShardingValue.getValue());return s;}/*** 构建分片后的表名* @param logicTableName* @param date* @return*/private String buildShardingTable(String logicTableName, String date) {StringBuffer stringBuffer = new StringBuffer(logicTableName).append("_").append(date, 0, 4);if (logicTableName.startsWith("month_table") ) {// 月分表stringBuffer = new StringBuffer(logicTableName).append("_").append(date, 0, 4).append(date, 5, 7);}return stringBuffer.toString();}}
4、注意事项
(1)分片主键不能修改。
(2)分表后如果需指定表,入参需使用例如 ${tableSuf}
${}和#{}的区别:${}参数不会携带‘’,但#{}会携带。
实施sharding-jdbc,一些非常痛的注意点 - 掘金 (juejin.cn)
相关文章:
springboot通过sharding-dbc按年、月分片
目录 springboot通过sharding-dbc按年、月分片 1、引入pom依赖 2、application.yml配置 3、分片算法 4、注意事项 1、引入pom依赖 <!--shardingjdbc分片,和Druid不兼容,如果不使用sharding则需要注释--><dependency><groupId>org.…...
基于静电放电算法优化的BP神经网络(预测应用) - 附代码
基于静电放电算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于静电放电算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.静电放电优化BP神经网络2.1 BP神经网络参数设置2.2 静电放电算法应用 4.测试结果:5…...
开发者插件推荐FeHelper
开发者巨好用的插件、有很多功能比如json美化、对比,二维码/解码,图片转Base64,时间戳转换等 一、下载插件 1、打开网址:FeHelper - Awesome(建议用谷歌打开); 2、选择要下载的版本,…...
【MySQL】JSON 格式字段处理
MySQL 5.7 版本后已支持 JSON 格式,这虽是 MySQL 的一小步,但可以说是程序开发的一大步,再也不用将 JSON 内容塞到 VARCHAR 类型字段了,程序设计也会变得更加灵活。网上大多只针对JSONObject 对象类型,本文也将详解 JS…...
数据库选型<1>
数据库选型 1.SQL与NoSQL1.SQL2.NoSQL 2.各种数据存储的适应场景1.MySQL 3.构建MySQL开发环境 1.SQL与NoSQL 1.SQL 关系型数据库 MySQLOracleSQL serverPostGreSQL 关系型数据库的特点 数据结构化存储在二维表中(新增JSON存储方式,也有nosql的特点)支持事务的原子…...
1.Flink源码编译
目录 1.环境版本 1.1 jdk 1.2.maven 1.3.node 1.4.scala 2.下载flink源码 3.编译源码 4.idea打开flink源码 5.运行wordcount 1.环境版本 软件地址 链接:https://pan.baidu.com/s/1ZxYydR8rBfpLCcIdaOzxVg 提取码:12xq 1.1 jdk 1.2 maven 1.…...
Linux内核数据结构 散列表
1、散列表数据结构 在Linux内核中,散列表(哈希表)使用非常广泛。本文将对其数据结构和核心函数进行分析。和散列表相关的数据结构有两个:hlist_head 和 hlist_node //hash桶的头结点 struct hlist_head {struct hlist_node *first…...
数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程
几个月之前写的一个项目,通过这个项目,你能学到关于数据库的触发器知识,python的基本语法,python一些第三方库的使用,包括python如何将前后端连接起来(界面和数据),还有界面的设计等…...
《C和指针》笔记9: typedef
C语言支持一种叫作typedef的机制,它允许你为各种数据类型定义新名字。typedef声明的写法和普通的声明基本相同,只是把typedef这个关键字出现在声明的前面。例如,下面这个声明: char *ptr_to_char;把变量ptr_to_char声明为一个指向…...
《C和指针》笔记6:gets/puts/scanf/printf/getchar函数用法
本博客可以了解一些gets/puts/scanf/printf/getchar函数的基本用法。 文章目录 1. gets函数2. puts函数3. scanf函数4. printf函数5. getchar函数6. putchar函数 1. gets函数 gets函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。一行输入由一串字符组成&a…...
智慧课堂学生行为检测评估算法
智慧课堂学生行为检测评估算法通过yolov5系列图像识别和行为分析,智慧课堂学生行为检测评估算法评估学生的表情、是否交头接耳行为、课堂参与度以及互动质量,并提供相应的反馈和建议。智慧课堂学生行为检测评估算法能够实时监测学生的上课行为࿰…...
rainbond云原生应用管理平台部署
rainbond简介 rainbond 是 一个 开源的Kubernetes 云原生应用管理平台。 Rainbond 核心100%开源,Serverless体验,不需要懂K8s也能轻松管理容器化应用,平滑无缝过渡到K8s,是国内首个支持国产化信创、适合私有部署的一体化应用管理…...
jemter连接数据json断言
文章目录 一、jmeter连接数据库1、加载JDBC驱动2、连接数据3、SQL Query的Query Type使用方法:4、Variable Name使用方法:5、Result variable name使用方法: 二、Json响应断言1、添加 》 断言 》 JSON断言2、JSON断言界面参数说明:…...
JavaFX 加载 fxml 文件
JavaFX 加载 fxml 文件主要有两种方式,第一种方式通过 FXMLLoader 类直接加载 fxml 文件,简单直接,但是有些控件目前还不知道该如何获取,所以只能显示,目前无法处理。第二种方式较为复杂,但是可以使用与 fx…...
(三)Redis——Set
SADD key value SMEMBERS 127.0.0.1:6379> SADD set aaa 1 127.0.0.1:6379> SMEMBERS set aaa 127.0.0.1:6379> SADD set aaa 0 127.0.0.1:6379> SMEMBERS set aaaSISMEMBER 判断 aaa 是否在 set 中 127.0.0.1:6379> SISMEMBER set aaa 1 127.0.0.1:6379>…...
Vue组件通信方式详解(全面版)
在Vue应用开发中,组件通信是一个重要的话题。不同的组件可能需要在不同的情况下进行数据传递和交互。Vue提供了多种方式来实现组件通信,每种方式都有其适用的场景。本文将详细介绍Vue中实现组件通信的各种方式,并为每种方式提供通俗易懂的代码…...
什么是Promise对象?它的状态有哪些?如何使用Promise处理异步操作?以及 async、await
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Promise对象⭐ 创建Promise对象⭐ 使用Promise处理异步操作⭐ async、await⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅…...
Android 之自定义绘制一
绘制的基本要素 onDraw(Canvas) 绘制方法 Canvas 绘制工具 Paint 调整风格 粗细等 坐标系: x y ,3D 会有z轴,x 左到右,y 上至下,与数学中y颠倒 尺寸单位: 布局中 dp ,sp ,代码中 px;dp 为了适配不同的尺寸 绘制的关键: draw(Canvas )......(关键类:Paint) Paint.ANTI_A…...
vue3 计算两个表单得到第三个表单数据
<el-formref"ruleFormRef"label-width"150px"label-suffix":":rules"rules":disabled"drawerProps.isView":model"drawerProps.rowData"><el-form-item label"云平台名称" prop"cloudId&…...
Premiere Pro软件安装包分享(附安装教程)
目录 一、软件简介 二、软件下载 一、软件简介 Adobe Premiere Pro,简称PR,是Adobe公司开发的一款非线性视频编辑软件,被广泛应用于电影、电视剧、广告、纪录片、独立电影和音乐会等影视制作领域。它被公认为是行业内的标准工具,…...
调幅无线传数据:避开这些坑,你的7kHz方波才能传得更远更稳
调幅无线传数据:避开这些坑,你的7kHz方波才能传得更远更稳 在业余无线电和嵌入式通信领域,调幅(AM)无线传输一直是低成本解决方案的热门选择。但许多工程师在尝试用7kHz方波调制高频载波时,总会遇到信号失真…...
n8n与Claude集成指南:构建AI代码生成与自动化执行工作流
1. 项目概述与核心价值最近在折腾自动化工作流时,我偶然发现了一个名为n8n-claude-code-guide的开源项目。这个项目乍一看名字,你可能以为它只是一个简单的代码指南,但深入探究后,你会发现它实际上是一个将两个强大的工具——n8n和…...
企业AI成本为什么总是失控?Token计量与费用归因体系设计
一、问题背景随着企业大规模接入大模型能力,一个普遍现象正在浮现:AI成本正在失控。月初预算批了10万,月底账单来了20万。问财务:钱花哪了?财务说:只知道总额,不知道细节。问IT:哪个…...
告别公网IP焦虑:用SakuraFrp免费隧道,5分钟搞定Linux服务器的SSH远程访问
5分钟实现无公网IP的Linux服务器远程访问:SakuraFrp实战指南 当你需要在外紧急处理家中或办公室的Linux服务器时,却发现没有公网IP无法远程连接,这种焦虑我深有体会。去年深夜的一次线上故障让我深刻认识到内网穿透工具的重要性——当时我正…...
告别MATLAB命令行里的‘天书’:手把手教你用symdisp优雅展示LaTeX公式
MATLAB符号计算可视化革命:用symdisp实现LaTeX级公式渲染 在科研和工程计算领域,MATLAB的符号计算工具箱一直是数学推导的利器,但长期以来,命令行输出的公式展示方式让许多研究者头疼——密密麻麻的文本表达式不仅难以直观理解&am…...
5个高效方法:如何用AKShare处理金融数据去重,避免重复数据干扰分析
5个高效方法:如何用AKShare处理金融数据去重,避免重复数据干扰分析 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcod…...
终极模组加载器指南:如何在5分钟内安全扩展《杀戮尖塔》游戏内容
终极模组加载器指南:如何在5分钟内安全扩展《杀戮尖塔》游戏内容 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire ModTheSpire是一款专为《杀戮尖塔》设计的开源模组加载器&…...
从空洞卷积到多尺度感知:图解PyTorch中ASPP的设计哲学与实现细节(附可运行代码)
从空洞卷积到多尺度感知:图解PyTorch中ASPP的设计哲学与实现细节(附可运行代码) 当我们观察一幅画时,眼睛会自然地聚焦在不同尺度的细节上——从整体构图到局部纹理,这种多尺度感知能力是人类视觉系统的核心优势。计算…...
AI开发者实战指南:从工具全景到本地知识库搭建
1. 从Awesome List到实战地图:一份AI开发者工具全景解析如果你是一名AI开发者、研究者,或者只是对构建AI应用充满好奇的技术爱好者,面对浩如烟海的工具、框架和平台,最头疼的恐怕就是“我该从哪里开始?”这个问题。网上…...
如何自定义 LangGraph 的 State Schema 以支持复杂业务数据流
标题选项 《LangGraph实战进阶:自定义State Schema搞定复杂业务数据流全指南》 《从零搞定LangGraph复杂工作流:State Schema自定义从原理到落地》 《告别简单Demo:自定义LangGraph State Schema支撑企业级复杂数据流》 《LangGraph核心原理解锁:State Schema自定义设计思路…...
