从零开始利用JPA与SHARDING-JDBC动态划分月表

2023-11-09

开始

从零开始利用spring-data-jpa与sharding-jdbc进行动态月表,直接上手。

需求说明

数据量按照分片键(入库时间)进入对应的月表,查询时根据分片键的值查询指定表;但是每次查询都必须带上分片键,这就不是很友好,所以另外后面也有说明在没有指定分片键时如何查询最近的两个月。

前期准备

建表语句
-- 逻辑表,每个月表都根据逻辑表生成
CREATE TABLE `EXAMPLE` (
  `ID` bigint(36) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(255) NOT NULL,
  `CREATED` datetime(3) DEFAULT NULL,
  `UPDATED` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 月表
CREATE TABLE `EXAMPLE_201909` (
  `ID` bigint(36) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(255) NOT NULL,
  `CREATED` datetime(3) DEFAULT NULL,
  `UPDATED` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `EXAMPLE_201910` (
  `ID` bigint(36) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(255) NOT NULL,
  `CREATED` datetime(3) DEFAULT NULL,
  `UPDATED` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
实体类
@Entity
@Data
@Table(name = "EXAMPLE")
public class Example implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ID")
	private String id;
	@Column(name = "NAME")
	private String name;
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS", timezone = "GMT+8")
	@Column(name = "CREATED")
	private Date created;
	@Column(name = "UPDATED", insertable = false, updatable = false)
	private Date updated;
}
repo
import java.util.Date;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import com.test.sharding.entity.Example;

public interface ExampleRepo extends JpaRepository<Example, Long>, JpaSpecificationExecutor<Example> {
	List<Example> findByCreatedBetween(Date start, Date end);
}
Maven依赖

经过测试,支持springboot 2.0.X+与1.5.X+。

<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jpa</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<scope>runtime</scope>
		<optional>true</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-configuration-processor</artifactId>
		<optional>true</optional>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<optional>true</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
		<exclusions>
			<exclusion>
				<groupId>org.junit.vintage</groupId>
				<artifactId>junit-vintage-engine</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupId>io.shardingsphere</groupId>
		<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
		<version>3.0.0</version>
	</dependency>
	<dependency>
		<groupId>cn.hutool</groupId>
		<artifactId>hutool-all</artifactId>
		<version>4.6.7</version>
	</dependency>
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-lang3</artifactId>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid</artifactId>
		<version>1.1.20</version>
	</dependency>
分片算法实现

由于选择的分片策略是StandardShardingStrategy(在后面的配置文件中会配置),所以需要试下下面两个分片算法:

  • 精确分片算法
import java.util.Collection;
import java.util.Date;
import cn.hutool.core.date.DateUtil;
import io.shardingsphere.api.algorithm.sharding.PreciseShardingValue;
import io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm;

public class MyPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Date> {
   
  // 可以优化为全局变量
	private static String yearAndMonth = "yyyyMM";

	@Override
	public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) {
   
		StringBuffer tableName = new StringBuffer();
		tableName.append(shardingValue.getLogicTableName()).append("_")
				.append(DateUtil.format(shardingValue.getValue(), yearAndMonth));
		return tableName.toString
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零开始利用JPA与SHARDING-JDBC动态划分月表 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • Object对象如何类获取对应类的属性值

    Object对象如何类获取对应类的属性值 public void test throws NoSuchFieldException IllegalAccessException Deposit deposit new Deposit dep
  • 卡方分布

    以上讲了一种称为服从正态分布的概率密度函数 今天 讲一讲服从 卡方分布 的概率密度函数 首先给出该函数的定义 自由度 是公式中一个重要参数 自由度不同 图形的形状也完全不同 众所周知 直线方程中的参数k是斜率 它控制着直线的倾斜角度 它不同
  • java中trim()方法

    string类型 指定要删除首部和尾部空格的字符串返回值String 函数执行成功时返回删除了string字符串首部和尾部空格的字符串 发生错误时返回空字符串 如果参数值为null时 会抛出空 指针异常 主要是为了防止复制过来首尾出现字符串
  • Day 15 - 面向对象2习题

    建立一个汽车类Auto 包括轮胎个数 汽车颜色 车身重量 速度等属性 并通过不同的构造方法创建实例 至少要求 汽车能够加速 减速 停车 再定义一个小汽车类CarAuto 继承Auto 并添加空调 CD属性 并且重新实现方法覆盖加速 减速的方
  • C++二叉树遍历总结\100. Same Tree

    理论学习 概念介绍 遍历图解 遍历算法 代码实践 实现模板 Same Tree 题目描述 代码实现 转载请注明出处 http blog csdn net c602273091 article details 55195284 理论学习 概念
  • ajp协议服务器端如何配置,详解Tomcat HTTP协议与AJP协议

    IT168评论 Tomcat最主要的功能是提供Servlet JSP容器 尽管它也可以作为独立的Java Web服务器 它在对静态资源 如HTML文件或图像文件 的处理速度 以及提供的Web服务器管理功能方面都不如其他专业的HTTP服务器
  • count()用啥好?

    按照效率排序的话 count 字段
  • template模板中的if判断语句

    if 0 value task state 22 else 33 if
  • 程序员,都去写一写前端代码吧

    转至 http www raychase net 1162 你可以认为我是一个极端的人 就像有许多人专注于自己的领域而不屑于其它 肤浅 的工作范畴一样 比如我见过不少认为做portal没有技术含量的判定 做工程都是充满苦逼行为的言论 最近则
  • Quant 实习申请总结[转自丁丁笑笑生]

    我是University of Michigan博士第四年的学生 专业是高能理论物理 弦论 从北大元培毕业来到美国之后 我对科研的兴趣 信心和成就感与日俱减 加之对于未来组建家庭的考虑 决定放弃科研理想和道路 寻找一份工作 养家糊口 积累一
  • C++ 中的 POD 类型

    C 内存管理系列文章汇总 C 中数据类型和变量总结 C 中内存分区总结 C 中三种内存对象特点总结 C 中栈对象的使用总结 C 中 static 静态对象的使用总结 C 中堆对象的使用总结 C 中普通类的对象布局 C 中字节对齐总结 C 继
  • Linux终端信息

    获取终端能显示的行数和列数 student myhost tput cols 140 student myhost tput lines 35 获取终端名 student myhost tput longname xterm with 25
  • 软工导论知识框架(八)面向对象设计风格

    一 面向对象实现 把面向对象设计结果翻译成面向对象程序 测试并调试面向对象的程序 二 程序设计语言 所有语言都可完成面向对象实现 但效果不同 使用非面向对象语言编写面向对象程序 则必须由程序员自己把面向对象概念映射到目标程序中 1 将来能够
  • 怎么用css画一个心形_如何用CSS创建心形

    CSS3增强了我们仅使用HTML和CSS就能在网站上构建内容的可行性 您可以找到我们以前精选的出色示例 但是 不要让自己过分领先 复杂的设计将需要可能使您头疼的代码 取而代之的是 我们将创建一些简单的内容 以帮助您先了解CSS的形状和位置
  • Integral nonlinearity (INL) and differential nonlinearity (DNL) of data converters

    Syntax s inldnl analog digital range type s inldnl Name Value Description example s inldnl analog digital range type cal
  • 与中断有关的MCS-51特殊功能寄存器

    MCS 51系列特殊功能寄存器 与中断有关的 一 中断允许寄存器IE 字节地址0A8H 位地址AFH A8H 1 EA CPU中断总允许位 EA 0时 屏蔽所有中断请求 EA 1时 CPU开放中断 2 ES 串行口中断允许位 ES 0时 串
  • 2021年开发Python图形用户界面(GUI)的6种最佳Python GUI框架

    几个知名的编程语言排行榜索引已证明了Python在全球开发人员中的崛起 但是 以开发人员为中心的英国分析家SlashData现在已经对使用该语言的开发人员的实际人数进行了估算 根据SlashData在2019年的统计 目前全球有820万使用
  • 小程序适老化设计指南

    小程序适老化设计指南 小程序适老化设计指南
  • IDEA 单元测试报错 java.lang.ClassNotFoundException: junit.framework.ComparisonFailure

    项目场景 单元测试时报错 java lang ClassNotFoundException junit framework ComparisonFailure 原因分析 提示 这里填写问题的分析 例如 Handler 发送消息有两种方式 分
  • 从零开始利用JPA与SHARDING-JDBC动态划分月表

    开始 从零开始利用spring data jpa与sharding jdbc进行动态月表 直接上手 需求说明 数据量按照分片键 入库时间 进入对应的月表 查询时根据分片键的值查询指定表 但是每次查询都必须带上分片键 这就不是很友好 所以另外