sharding sphere 4.0.0-RC1版本 按年分表(自动建表)

2024-05-02 10:18

本文主要是介绍sharding sphere 4.0.0-RC1版本 按年分表(自动建表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. sharding sphere 4.0.0-RC1版本 按年分表(自动建表)

1.1. 概述

上篇文章留了个坑,sharding sphere本身没有提供自动建表功能,但我想了想,我们可以绕过它本身的设定,它本身的数据分片是通过分片算法实现,如下继承一些接口PreciseShardingAlgorithmRangeShardingAlgorithm等,在范围查询的时候,原本我们需要从availableTargetNames参数去判断已存在的表,从而做到不查不存在的表,插入时也是同样的道理

但是事实上我们可以不需要使用availableTargetNames参数,在系统初始化的时候自行去查询已存在的表再缓存起来,当然过程中我也踩了些坑,因为LogShardingAlgorithm的加载过程和我读数据库的顺序不好控制,理论上我可以随时连接数据库读,但我又需要读到spring加载的配置环境再决定连哪个数据库,不断的测试后还是不好安排,最后采取了如下的方式,在第一次调用分片算法的时候读取并缓存表

这样做后实现的效果就是在做插入数据的时候,我判断日期为2020年的表是否在缓存中,在则说明数据库存在该表,否则我先创建该表,再把该表加入缓存;而做范围查询的时候,我们容易请求参数超范围,则从缓存中的表挑选,这些表才是存在的,比如你数据库存在2018,2019,2020年的表,你查询条件是2017~2021,那么也只会查18,19,20三张表

/*** @author: laoliangliang* @description: 日志分片* @create: 2020/1/2 10:19**/
@Slf4j
public class LogShardingAlgorithm implements PreciseShardingAlgorithm, RangeShardingAlgorithm<Integer> {/*** 缓存存在的表*/private List<String> tables;private final String systemLogHead = "system_log_";private Boolean isLoad = false;@Overridepublic String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) {if (!isLoad) {tables = DBUtil.getAllSystemLogTable();isLoad = true;}String target = shardingValue.getValue().toString();String year = target.substring(target.lastIndexOf("_")   1, target.lastIndexOf("_")   5);if (!tables.contains(systemLogHead   year)) {DBUtil.createLogTable(year);tables.add(year);}return shardingValue.getLogicTableName()   "_"   year;}@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Integer> shardingValue) {if (!isLoad) {tables = DBUtil.getAllSystemLogTable();isLoad = true;}Collection<String> availables = new ArrayList<>();Range valueRange = shardingValue.getValueRange();for (String target : tables) {Integer shardValue = Integer.parseInt(target.substring(target.lastIndexOf("_")   1, target.lastIndexOf("_")   5));if (valueRange.hasLowerBound()) {String lowerStr = valueRange.lowerEndpoint().toString();Integer start = Integer.parseInt(lowerStr.substring(0, 4));if (start - shardValue > 0) {continue;}}if (valueRange.hasUpperBound()) {String upperStr = valueRange.upperEndpoint().toString();Integer end = Integer.parseInt(upperStr.substring(0, 4));if (end - shardValue < 0) {continue;}}availables.add(target);}return availables;}
}

1.2. 技巧

  1. 这里要读取system_log_2019,system_log_2020表的表名只需查询mysql的information_schema.TABLES,如:
select TABLE_NAME from information_schema.`TABLES`
where TABLE_NAME like 'system_log_%'

老梁讲Java

欢迎关注公众号,回复“教学视频”一起学习进步

这篇关于sharding sphere 4.0.0-RC1版本 按年分表(自动建表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954022

相关文章

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Linux升级或者切换python版本实现方式

《Linux升级或者切换python版本实现方式》本文介绍在Ubuntu/Debian系统升级Python至3.11或更高版本的方法,通过查看版本列表并选择新版本进行全局修改,需注意自动与手动模式的选... 目录升级系统python版本 (适用于全局修改)对于Ubuntu/Debian系统安装后,验证Pyt

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade