Spring Boot+ShardingSphere+MySQL实现分库分表:高效数据库扩展

在构建现代Web应用程序时,数据库的性能和可扩展性是至关重要的。当应用程序的数据量逐渐增加时,传统的单一数据库可能无法满足需求。分库分表是一种有效的数据库水平扩展方法,可以显著提高数据库性能并实现负载均衡。

什么是分库分表

分库分表是一种数据库水平分割技术,它将一个大型数据库分为多个小型数据库(分库),每个小型数据库包含多个数据表(分表)。这有助于减轻单一数据库的负载压力,提高性能和可伸缩性。

ShardingSphere简介

ShardingSphere是一款强大的开源数据库中间件,它提供了分库分表、数据分片和负载均衡等功能。通过ShardingSphere,我们可以轻松实现分库分表,使数据库扩展变得更加容易。

分库分表的适用场景

分库分表适用于以下场景:

高负载应用程序:当应用程序需要处理大量数据时,分库分表可以有效减轻数据库负载。

大数据应用:对于大规模数据应用,分库分表可以加速查询和提高响应速度。

多租户应用:分库分表可以隔离不同租户的数据,确保安全性和性能。

Spring Boot + ShardingSphere实现分库分表

步骤1:添加依赖

首先,在您的Spring Boot项目中添加ShardingSphere的依赖。打开pom.xml文件并添加以下依赖:

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

步骤2:配置数据源

在application.properties或application.yml文件中配置数据源和分库分表规则。这是一个示例配置:

spring:shardingsphere:datasource:names: ds0, ds1ds0:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db0username: rootpassword: rootds1:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db1username: rootpassword: rootsharding:tables:user:actualDataNodes: ds0.user_${0..1}, ds1.user_${0..1}tableStrategy:inline:shardingColumn: user_idalgorithmExpression: user_${user_id % 2}

步骤3:编写代码

编写Spring Boot服务和数据访问层代码来执行数据库操作。ShardingSphere会根据配置自动路由数据。以下是一个示例:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public void createUser(User user) {userRepository.save(user);}public User getUserById(Long userId) {return userRepository.findById(userId).orElse(null);}// 其他操作...
}

示例代码解释

我们定义了两个数据源(ds0和ds1),每个数据源对应一个数据库。actualDataNodes定义了数据表的分布,${0..1}表示两张数据表,user_${user_id % 2}表示根据user_id的奇偶分配到不同的表中。

ShardingSphere分库分表策略

ShardingSphere提供了多种分库分表策略,使您可以根据不同的需求来选择合适的策略。除了基于奇偶数的分库分表策略之外,还有其他常用的分库分表策略,包括:

1. 标准分片策略(Standard Algorithm):标准分片策略允许您根据某个字段的具体值范围来分割数据。例如,您可以将数据按照时间范围进行分表,每个表代表一段时间的数据。

自定义精确分片策略

import org.apache.shardingsphere.api.sharding.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.ShardingValue;import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;public class PreciseShardingByYearAlgorithm implements PreciseShardingAlgorithm<Date> {@Overridepublic String doSharding(Collection<String> availableTargetNames, ShardingValue<Date> shardingValue) {// 获取传入的日期Date createTime = shardingValue.getValue();// 根据日期计算年份int year = getYear(createTime);// 构建表名,假设表名为 order_年份String tableName = "order_" + year;// 返回计算后的表名return tableName;}// 从日期中获取年份private int getYear(Date date) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy");return Integer.parseInt(sdf.format(date));}
}
spring:shardingsphere:sharding:tables:order:actualDataNodes: ds${0..1}.order_${201901..201912}tableStrategy:standard:shardingColumn: create_timepreciseAlgorithmClassName: com.example.order.PreciseShardingByYearAlgorithm 

2. 取模分片策略(Mod Algorithm):取模分片策略根据某个字段的取模结果来分库分表。这可以是用于平均分配数据的一种策略,通常用于均匀分布数据。

spring:shardingsphere:sharding:tables:user:actualDataNodes: ds${0..1}.user_${0..9}tableStrategy:inline:shardingColumn: user_idalgorithmExpression: user_${user_id % 10}

3. 复合分片策略(Complex Algorithm):复合分片策略允许您使用多个分片键来确定数据应该被路由到哪个库和表。这在复杂的场景中很有用,可以根据多个条件来选择数据的位置。

自定义复合分片策略的实现

import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;import java.util.Collection;
import java.util.HashSet;public class ComplexShardingAlgorithm implements ComplexKeysShardingAlgorithm<Long> {@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, ComplexKeysShardingValue<Long> shardingValue) {Collection<String> result = new HashSet<>();Long userId = shardingValue.getColumnNameAndShardingValuesMap().get("user_id").iterator().next();Long orderId = shardingValue.getColumnNameAndShardingValuesMap().get("order_id").iterator().next();// 自定义分片逻辑,根据userId和orderId决定数据路由到哪个库和表// 这里只是一个示例,您需要根据实际需求编写合适的分片逻辑// 假设有两个库 ds0 和 ds1,两个表 order_0 和 order_1if (userId % 2 == 0) {result.add("ds0.order_" + orderId % 2);} else {result.add("ds1.order_" + orderId % 2);}return result;}
}

在配置文件中引用自定义复合分片策略:

spring:shardingsphere:sharding:tables:order:actualDataNodes: ds${0..1}.order_${0..1}tableStrategy:complex:shardingColumns: user_id, order_idalgorithmClassName: com.example.order.ComplexShardingAlgorithm

在上面的配置中,user_idorder_id字段的组合用于分表。

4. Hint分片策略(Hint Algorithm):Hint分片策略允许应用程序在运行时通过Hint来指定数据应该被路由到哪个库和表。这种方式可以在不修改SQL语句的情况下进行分片。

ShardingHint shardingHint = new ShardingHint();
shardingHint.addDatabaseShardingValue("user", 1);
shardingHint.addTableShardingValue("user", 1);
ShardingContextHolder.setShardingHint(shardingHint);User user = userService.getUserById(1L);ShardingContextHolder.clearShardingHint();

5. 自定义分片策略(Custom Algorithm):如果以上内置的策略不满足需求,您还可以编写自定义的分片策略,根据特定的逻辑来决定数据的路由。

以下是一个自定义分片策略的示例:

public class CustomShardingAlgorithm implements PreciseShardingAlgorithm<Long> {@Overridepublic String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {// 根据自定义逻辑来决定数据路由// 返回目标表的名称}
}

然后在配置文件中引用自定义分片策略:

spring:shardingsphere:sharding:tables:custom_table:actualDataNodes: ds0.custom_table, ds1.custom_tabletableStrategy:standard:shardingColumn: custom_idpreciseAlgorithmClassName: com.example.sharding.CustomShardingAlgorithm

这些分库分表策略提供了灵活性和多样性,使您能够根据应用程序的需求选择最适合的策略。每种策略都有其适用的场景,您可以根据具体情况选择最合适的策略来优化数据库性能和数据分布。

优点

高性能:分库分表可以显著提高数据库性能,降低负载。

可扩展性:您可以轻松扩展数据库服务器,应对不断增长的数据量。

负载均衡:数据分布在多个库和表中,实现负载均衡。

总结

Spring Boot与ShardingSphere是一个强大的组合,可以帮助您实现分库分表,提高数据库性能和可扩展性。无论您构建大型电子商务平台还是多租户SaaS应用程序,分库分表都是一个强大的工具,值得一试。通过合理的数据库设计和ShardingSphere的配置,您可以确保应用程序在面对大量数据和高负载时仍能保持高性能。现在,您可以尝试在您的项目中实现分库分表,提升数据库性能,满足不断增长的需求!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue+SpringBoot打造开放实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

数据库-数据库设计-社交关系

佛 每有一个新方案&#xff0c;就要考虑有什么影响增删改查可扩展性 MySQL 根据ER图设计表 create table follow(id bigint unsigned not null auto_increment comment 主键,gmt_create datetime null default current_timestamp,gmt_modified null default current_timest…

hive表中导入数据 多种方法详细说明

文章中对hive表中导入数据 方法目录 方式一&#xff1a;通过load方式加载数据 方式二&#xff1a;直接向分区表中插入数据 方式三&#xff1a;查询语句中创建表并加载数据&#xff08;as select&#xff09; 方式四&#xff1a;创建表时通过location指定加载数据路径 1. 创建表…

真值表,主析取范式,主合取范式,栈,哈希表

利用栈对表达式求值 根据运算符的各运算符的优先顺序&#xff0c;确定入栈操作 if(compare(s2.top(),s[i])-1)栈内的优先级小&#xff0c;栈外的运算符入栈if(compare(s2.top(),s[i])0)栈内的优先级与栈外的优先级相同&#xff0c;栈内运算符出栈if(compare(s2.top(),s[i]1)栈…

人工智能机器视觉、大数据与向量数据库的交融之路

文章目录 人工智能机器视觉、大数据与向量数据库的交融之路引言计算机视觉发展现状与趋势技术演进历程回顾当前的主要发展方向 大数据与计算机视觉的相互关系数据驱动下的CV技术进步向量数据库在图像检索与分析中的作用 具体应用案例剖析如何利用大数据和向量数据库解决CV难题代…

设计模式-创建型模式-建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。 建造者模式一步一步地创建一个复杂的对象&#xff0c;它允许用户只通过指定复杂对象…

LeetCode 1393.股票的资本损益

Stocks 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | stock_name | varchar | | operation | enum | | operation_day | int | | price | int | ---------------------- (stock_name, day) 是这张表的主键(具有唯一值的列的组合) …

windows 中, bash: conda: command not found(已解决)

git bash 中运行conda命令&#xff0c;出现这种错误&#xff0c;原因是你没有在git bash中 配置conda&#xff0c;导致git bash无法找到conda 那就配置一下&#xff0c;找到你的conda的安装位置下的bash.sh文件&#xff0c;一般在安装位置&#xff08;我的安装在C盘的自定义路径…

RocketMQ生产环境常见问题分析与总结

RocketMQ生产环境常见问题分析与总结 如何保证消息不丢失 消息丢失场景 对于跨网络的节点可能会丢消息&#xff0c;因为MQ存盘都会先写入OS的PageCache中&#xff0c;然后再让OS进行异步刷盘&#xff0c;如果缓存中的数据未及时写入硬盘就会导致消息丢失 生产端到Broker端Brok…

nc开发刚导入项目eclipse出现莫名其妙的错误,红叉,感叹号,文件missing

解决类出现红叉 解决感叹号&#xff0c;文件missing 其他问题 右上角的视图&#xff0c;要选择java&#xff0c;如果是javaEE也会有一些文件没有展示出来。

2024全国水科技大会暨土壤和地下水污染防治与修复技术创新论坛(七)

论坛召集人&#xff1a;李 辉 上海大学环境与化学工程学院教授 一、会议背景 十四五”时期&#xff0c;我国生态文明建设进入以减污降碳协同增效为重点战略方向&#xff0c;促进经济社会发展全面绿色转型&#xff0c;实现生态环境质量改善由量变到质变的关键时期。聚焦土壤与地…

挑战杯 基于机器学习与大数据的糖尿病预测

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE&#xff08;递归特征消除法&#xff09;4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

三、OpenAI之Function Calling实战

黑8决心将对 OpenAI API 的学习应用到更多实际场景中&#xff0c;以展示新时代技术的巨大潜力。在接下来的日子里&#xff0c;他不断探索和尝试&#xff0c;将 API 中的各种功能融入到不同的生活场景中&#xff0c;取得了一系列令人瞩目的成果。 首先&#xff0c;他将 OpenAI …

Chrome插件(二)—Hello World!

本小节将指导你从头到尾创建一个基本的Chrome插件&#xff0c;你可以认为是chrome插件开发的“hello world”&#xff01; 以下详细描述了各个步骤&#xff1a; 第一步&#xff1a;设置开发环境 确保你拥有以下工具&#xff1a; 文本编辑器&#xff1a;如Visual Studio Cod…

Django学习记录04——靓号管理整合

1.靓号表 1.1 表结构 1.2 靓号表的构造 class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name"手机号", max_length11)# default 默认值# null true&#xff0c;blank true 允许为空price models.IntegerField(verbose_name"价…

EasyRecovery易恢复软件数据恢复方面表现优势有哪些?

EasyRecovery易恢复软件在数据恢复方面表现优异。它支持多种设备的数据恢复&#xff0c;如硬盘、光盘、U盘/移动硬盘、数码相机等&#xff0c;并且能够恢复包括文档、图片、视频、音频等各种类型的文件。无论是误删除、格式化、分区丢失还是硬件故障导致的数据丢失&#xff0c;…

mysql 运行参数优化

mysql 运行参数优化 InnoDB设置 1.innodb_buffer_pool_size —— 默认值为 128M. 这是最主要的优化选项,因为它指定 InnoDB 使用多少内存来加载数据和索引(dataindexes). 针对专用MySQL服务器,建议指定为物理内存的 50-80%这个范围. 例如,拥有64GB物理内存的机器,缓存池应该设…

设计模式学习笔记 - 面向对象 - 3.面向对象比面向过程有哪些优势?面向过程真的过时了吗?

简述 在过往的工作中&#xff0c;我发现很多人搞不清面向对象和面向过程的区别&#xff0c;总认为使用面向对象编程语言来开发&#xff0c;就是在面向面向对象编程了。而实际上&#xff0c;他们只是在用面向对象编程语言&#xff0c;编写面向过程风格的代码而已&#xff0c;并…

目标跟踪之KCF详解

High-Speed Tracking with Kernelized Correlation Filters 使用内核化相关滤波器进行高速跟踪 大多数现代跟踪器的核心组件是判别分类器&#xff0c;其任务是区分目标和周围环境。为了应对自然图像变化&#xff0c;此分类器通常使用平移和缩放的样本补丁进行训练。此类样本集…

目标检测新SOTA:YOLOv9 问世,新架构让传统卷积重焕生机

在目标检测领域&#xff0c;YOLOv9 实现了一代更比一代强&#xff0c;利用新架构和方法让传统卷积在参数利用率方面胜过了深度卷积。 继 2023 年 1 月 YOLOv8 正式发布一年多以后&#xff0c;YOLOv9 终于来了&#xff01; 我们知道&#xff0c;YOLO 是一种基于图像全局信息进行…