当前位置: 首页 > news >正文

与 Spring Boot 的无缝集成:ShardingSphere 快速集成实践

ShardingSphere 是一个轻量级的开源分布式数据库中间件,它支持分库分表、分布式事务、读写分离等功能。它能够与各种应用框架进行集成,其中与 Spring Boot 的集成非常流行,因为它能够帮助开发者在 Spring Boot 项目中快速实现高性能的分布式数据库管理。

本文将介绍如何通过 ShardingSphere 与 Spring Boot 快速集成,实现分库分表、读写分离等功能。


一、ShardingSphere 简介

ShardingSphere 是一个支持分布式数据库中间件功能的开源项目,提供以下几个关键特性:

  • 分库分表:通过数据库的水平切分,进行数据的分布式存储。
  • 读写分离:支持数据库的读写分离,提高数据库性能。
  • 分布式事务:提供两阶段提交协议(2PC)和 XA 事务支持,保证跨数据库的事务一致性。
  • 数据加密与安全:支持数据库数据加密,保障数据安全。
  • 灵活的数据库路由与执行引擎:支持动态路由和SQL解析。

ShardingSphere 与 Spring Boot 的集成能够简化分布式数据库的使用,同时提供灵活的配置和高效的性能。


二、ShardingSphere 与 Spring Boot 集成的步骤

1. 环境准备

首先,我们需要一个 Spring Boot 项目,并确保已安装以下组件:

  • Spring Boot:用于构建后端应用程序。
  • ShardingSphere-JDBC:这是 ShardingSphere 的 JDBC 模块,负责与数据库进行交互。
  • Spring Data JPA / MyBatis:根据需要集成 JPA 或 MyBatis 来访问数据库。
  • 数据库:可以使用 MySQL、PostgreSQL 或其他关系型数据库。
2. 创建 Spring Boot 项目

使用 Spring Initializr 创建一个 Spring Boot 项目,选择所需的依赖项,例如:

  • Spring Web
  • Spring Data JPA 或 MyBatis(根据需求)
  • H2 或 MySQL(数据库)

你可以使用 Spring Initializr 的官网来创建项目。

3. 添加 ShardingSphere 依赖

pom.xml 中添加 ShardingSphere-JDBC 依赖。

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Starter Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL JDBC Driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- ShardingSphere-JDBC dependency --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.0.0</version> <!-- 使用对应的 ShardingSphere 版本 --></dependency>
</dependencies>
4. 配置数据源和 ShardingSphere

ShardingSphere 的配置主要通过 application.ymlapplication.properties 来实现。以下是一个典型的配置示例,配置了 分库分表读写分离 功能。

spring:datasource:type: com.zaxxer.hikari.HikariDataSourcedruid:# 主库配置master:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/your_master_db?serverTimezone=UTCusername: rootpassword: rootmax-active: 20min-idle: 5# 从库配置slave:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3307/your_slave_db?serverTimezone=UTCusername: rootpassword: rootmax-active: 20min-idle: 5shardingsphere:datasource:names: master,slavemaster:url: jdbc:mysql://localhost:3306/your_master_dbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverslave:url: jdbc:mysql://localhost:3307/your_slave_dbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver# 配置 ShardingSphere 的分库分表策略sharding:tables:order:actual-data-nodes: ds${0..1}.order_${0..1}table-strategy:inline:sharding-column: order_idalgorithm-expression: order_${order_id % 2}# 配置读写分离readwrite-splitting:data-source-name: masterstatic:- name: masterwrite: true- name: slavewrite: falseread: true

在上面的配置中:

  • 数据源配置:配置了主库 master 和从库 slave,实现读写分离。
  • 分库分表配置:为 order 表配置了一个简单的分片策略,按照 order_id 进行分库分表。
  • 读写分离配置:配置了主库为写库,从库为读库。
5. 配置 ShardingSphere 代理

在 Spring Boot 配置中,我们可以设置 ShardingSphere 的 DataSource 和路由规则,通过 ShardingSphere 提供的 Spring Boot Starter 自动集成。ShardingSphere 会自动从配置文件读取相关信息并创建分片数据源。

application.yml 中配置完数据源和 ShardingSphere 后,Spring Boot 会自动注入 ShardingSphere 数据源。

6. 编写实体类和数据库访问层

在 Spring Boot 项目中,可以使用 JPA 或 MyBatis 来访问数据库。在 entity 类中,定义相应的字段和表结构。以下是一个简单的 JPA 实体类:

@Entity
public class Order {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long orderId;private String orderName;// Getter and Setter methods
}

通过 Spring Data JPA,创建 OrderRepository

public interface OrderRepository extends JpaRepository<Order, Long> {List<Order> findByOrderName(String orderName);
}
7. 启动 Spring Boot 应用

确保 ShardingSphere 的配置正确,然后启动 Spring Boot 应用:

mvn spring-boot:run

在应用启动后,Spring Boot 将自动创建数据源并进行分库分表操作。


三、测试与验证

在集成完成后,可以通过编写测试来验证分库分表和读写分离是否正常工作。例如,创建一些订单并查看其是否被正确路由到不同的数据库。

测试案例:
@SpringBootTest
public class ShardingSphereTest {@Autowiredprivate OrderRepository orderRepository;@Testpublic void testCreateOrder() {Order order = new Order();order.setOrderName("Test Order");orderRepository.save(order);}@Testpublic void testReadOrders() {List<Order> orders = orderRepository.findByOrderName("Test Order");orders.forEach(order -> System.out.println(order.getOrderId()));}
}

四、总结

通过 ShardingSphere 与 Spring Boot 的无缝集成,我们可以在 Spring Boot 应用中轻松实现分库分表、读写分离等功能。ShardingSphere 提供了强大的分布式数据库中间件能力,能够帮助开发者在不修改业务代码的情况下,灵活地扩展数据库系统,同时保持高可用性和高性能。以上的集成步骤展示了如何快速启动一个 ShardingSphere 集成的 Spring Boot 项目,你可以根据自己的需求进行自定义配置和优化。

相关文章:

与 Spring Boot 的无缝集成:ShardingSphere 快速集成实践

ShardingSphere 是一个轻量级的开源分布式数据库中间件&#xff0c;它支持分库分表、分布式事务、读写分离等功能。它能够与各种应用框架进行集成&#xff0c;其中与 Spring Boot 的集成非常流行&#xff0c;因为它能够帮助开发者在 Spring Boot 项目中快速实现高性能的分布式数…...

【QT】窗口/界面置于最前端显示,且激活该窗口

目录 0.环境 1.问题描述 2.具体实现 0.环境 windows11 qt 1.问题描述 我有一个窗口QMainWindow&#xff08;也适用于QWidget或QDialog&#xff09;&#xff0c;想让其在显示的时候置于最前面&#xff0c;且激活成为当前活动窗口 2.具体实现 mainWindow->show();mainWind…...

DOL-288 多功能电子计时器说明书

新买一个计时器&#xff0c;它的用法不太直观&#xff0c;所以把说明书留在这里&#xff0c;以便以后查询。 DOL-288 多功能电子计时器说明书 1.功能说明&#xff1a; 正计时功能&#xff0c;计时上限为23小时59分59秒倒计时功能&#xff0c;计时上限为23小时59分59秒&#…...

14 常用的负载均衡算法

基于nginx的代理 1. 轮询算法 例如我们在nginx服务器中代理了3台服务器&#xff0c;再每次客户端发起请求的时候按照顺序请求挨次的发送到代理的三台服务器上。该算法比较适合每台服务器性能差不多的场景&#xff0c;如果部分服务器性能比较差&#xff0c;可能会造成性能好的…...

方法建议ChatGPT提示词分享

方法建议 ChatGPT能够根据您的具体需求提供针对性的建议&#xff0c;帮助您选择最合适的研究方法。通过清晰的提示&#xff0c;ChatGPT可以精准地为您提供最契合的研究方案。此外&#xff0c;它还能协助您将这些方法灵活地应用于新的研究环境&#xff0c;提出创新的技术解决方案…...

如何提高自动化测试覆盖率和效率

用ChatGPT做软件测试 在现代软件开发中&#xff0c;自动化测试已经成为保证软件质量的重要手段。然而&#xff0c;在实践中&#xff0c;自动化测试的覆盖率和效率常常受到限制&#xff0c;导致潜在缺陷未能及时发现或测试资源浪费。因此&#xff0c;提升自动化测试的覆盖率和效…...

Django学习笔记(安装和环境配置)-01

Django学习笔记(安装和环境配置)-01 一、创建python环境 1、可以通过安装Anaconda来创建一个python环境 # 创建一个虚拟python环境 conda create -n django python3.8 # 切换激活到创建的环境中 activate django2、安装django # 进入虚拟环境中安装django框架 pip install …...

【PHP】部署和发布PHP网站到IIS服务器

欢迎来到《小5讲堂》 这是《PHP》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言安装PHP 稳定版本线程安全版解压使用 PHP配置 配置文件扩展文件…...

渗透测试之SSRF漏洞原理 危害 产生的原因 探测手法 防御手法 绕过手法 限制的手段

目录 SSRF说明: SSRF攻击流程 原理&#xff1a; 危害: SSRF产生的原因 ssrf漏洞利用{危害} 探测手法是否存在SSRF漏洞 如何找ssrf漏洞位置 分享连接地址 google hack url关键字 PHP语言中可能出现的ssrf漏洞函数 file_get_contents sockopen() curl_exec() SSRF…...

微信小程序-base64加解密

思路&#xff1a;先创建一个base64.js的文件&#xff0c;这个文件可以作为专门加解密的文件模块&#xff0c;需要时就引用&#xff1b;创建好后&#xff0c;引用base64.js里的加解密函数。 注意&#xff1a;引用模块一定要引用正确的路径&#xff0c;否则会报错。 base64.js:…...

Linux shell 批量验证端口连通性

脚本 #!/bin/bash # #database check #set -o nounset LOCALIPifconfig | grep inet | head -1 | awk {print $2} | sed s/addr\:// IPLIST192.168.1.99 192.168.1.98 192.168.1.97 PORTLIST81 82 83 84 85 86 check_nc(){ for CHECK_IP in $IPLIST dofor CHECK_PORT in $PORT…...

2025-1-21 Newstar CTF web week1 wp

文章目录 week1headach3会赢吗智械危机 week1 headach3 根据提示&#xff0c;在页面的请求头里找到flag flag{You_Ar3_R3Ally_A_9ooD_d0ctor} 会赢吗 打开控制台&#xff0c;拿到第一部分flag 将地址栏改为提示&#xff0c;去到下一关 控制台调用函数&#xff0c;得到flag …...

【系统架构】如何设计一个秒杀系统?

目录 1. 什么是秒杀&#xff1f; 2. 秒杀系统的特点 3. 如何设计秒杀系统&#xff1f; 3.1 前端秒杀设计 3.2 后端秒杀设计 4. 如何保证不超卖&#xff1f; 4.1 库存扣减方式 4.2 服务端库存处理 5. 总结 * 知识扩展&#xff1a;什么是CDN&#xff1f; 1. 什么是秒杀…...

C++模拟实现queue

C模拟实现queue 1.queue的基本概念2.queue的基本框架3.size()成员函数4.empty()成员函数5.push()成员函数6.pop()成员函数7.front()成员函数8.back()成员函数9.完整代码 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x…...

【2025小年源码免费送】

&#x1f496;学习知识需费心&#xff0c; &#x1f4d5;整理归纳更费神。 &#x1f389;源码免费人人喜&#xff0c; &#x1f525;码农福利等你领&#xff01; &#x1f496;山高路远坑又深&#xff0c; &#x1f4d5;大军纵横任驰奔&#xff0c; &#x1f389;谁敢横刀立马行…...

PyQt5 超详细入门级教程上篇

PyQt5 超详细入门级教程 上篇&#xff1a;1-3部分&#xff1a;PyQt5基础与常用控件 第1部分&#xff1a;初识 PyQt5 和安装 1.1 什么是 PyQt5&#xff1f; PyQt5 是 Python 的图形用户界面 (GUI) 框架&#xff0c;它基于强大的 Qt 库。Qt 是一个跨平台的 C 框架&#xff0c;用…...

qiankun+vite+vue3

基座与子应用代码示例 本示例中,基座为Vue3,子应用也是Vue3,由于qiankun不支持Vite构建的项目,这里还要引入 vite-plugin-qiankun 插件 基座(主应用) 加载qiankun依赖 npm i qiankun -S qiankun配置(src/qiankun) src/qiankun/config.ts export default {subApp…...

【数据结构】顺序队列与链式队列

顺序队列与链式队列 1.队列的基本概念1.顺序存储的队列&#xff1a;循环队列3.链式存储的队列&#xff1a;链式队列 1.队列的基本概念 队列是一种逻辑结构&#xff0c;是一种特殊的线性表 只能在固定的两端操作线性表 只要满足上述条件&#xff0c;那么这种特殊的线性表就会…...

Cursor的详细使用指南

以下是一份关于 Cursor 的详细使用指南&#xff1a; 一、安装与设置 下载与安装&#xff1a; 首先&#xff0c;访问 Cursor 的官方网站&#xff0c;根据你的操作系统&#xff08;Windows、Mac 或 Linux&#xff09;下载相应的安装程序。运行安装程序&#xff0c;按照屏幕上的提…...

2025美赛数学建模B题思路+模型+代码+论文

2025美赛数学建模A题B题C题D题E题思路模型代码&#xff08;1.24第一时间更新&#xff0c;更新见文末名片&#xff09; 论文数学建模感想 纪念逝去的大学数学建模&#xff1a;两次校赛&#xff0c;两次国赛&#xff0c;两次美赛&#xff0c;一次电工杯。从大一下学期组队到现在…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...