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版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

linux部署NFS和autofs自动挂载实现过程

《linux部署NFS和autofs自动挂载实现过程》文章介绍了NFS(网络文件系统)和Autofs的原理与配置,NFS通过RPC实现跨系统文件共享,需配置/etc/exports和nfs.conf,... 目录(一)NFS1. 什么是NFS2.NFS守护进程3.RPC服务4. 原理5. 部署5.1安装NF

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. 检测到延时过