Spring Boot项目中使用Sharding-JDBC实现读写分离
Sharding-JDBC是一个分布式数据库中间件,它不仅支持数据分片,还可以轻松实现数据库的读写分离。下面是如何在Spring Boot项目中集成Sharding-JDBC并实现读写分离的详细步骤:
目录
1. 引入依赖
2. 配置数据源
3. 配置Sharding-JDBC相关参数
4. 配置Spring Boot的事务管理
5. 使用Sharding-JDBC进行数据库操作
6. 测试配置
7. 常见问题
1. 引入依赖
在Spring Boot项目的pom.xml文件中引入Sharding-JDBC的依赖:
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>5.1.2</version> <!-- 选择合适的版本 -->
</dependency>
2. 配置数据源
Sharding-JDBC支持通过YAML、Properties、或者Spring Boot的application.yml/application.properties文件来配置数据源。这里以application.yml为例。
假设你有一个主库和两个从库,master是主库,slave0和slave1是从库。
spring:shardingsphere:datasource:names: master,slave0,slave1master:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/master_db?serverTimezone=UTC&useSSL=falseusername: rootpassword: rootslave0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/slave0_db?serverTimezone=UTC&useSSL=falseusername: rootpassword: rootslave1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/slave1_db?serverTimezone=UTC&useSSL=falseusername: rootpassword: rootrules:replica-query:data-sources:pr_ds:primary-data-source-name: masterreplica-data-source-names:- slave0- slave1load-balancer-name: round_robin # 负载均衡策略load-balancers:round_robin:type: ROUND_ROBIN # 轮询负载均衡策略
3. 配置Sharding-JDBC相关参数
可以通过配置spring.shardingsphere前缀下的参数来定制Sharding-JDBC的行为。常用的配置包括:
primary-data-source-name: 指定主数据库replica-data-source-names: 指定从数据库load-balancer-name: 选择负载均衡策略
4. 配置Spring Boot的事务管理
为了保证在读写分离的情况下事务的一致性,需要配置Spring的事务管理器。Sharding-JDBC内部已经封装好了事务管理,通常情况下不需要额外配置。
如果有特殊需求,可以自定义事务管理器。例如:
@Configuration
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
5. 使用Sharding-JDBC进行数据库操作
使用Sharding-JDBC之后,开发者不需要做特别的操作,Sharding-JDBC会自动根据SQL的类型(查询、插入、更新、删除)选择合适的数据库进行操作。例如:
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactionalpublic void createUser(User user) {userMapper.insert(user); // 插入操作会走主库}public User getUserById(Long id) {return userMapper.selectById(id); // 查询操作会走从库}
}
在上述代码中,createUser方法中的插入操作会自动路由到主库,而getUserById方法中的查询操作会根据配置路由到从库。
6. 测试配置
完成上述配置后,你可以编写一些测试代码来验证读写分离是否生效。通过在应用中插入数据然后查询,可以验证数据是否正确地写入主库并从从库中读取。
7. 常见问题
- 事务问题:在分布式环境中,事务的实现可能会比较复杂。Sharding-JDBC支持本地事务,分布式事务需要额外的配置或使用其他事务协调器(如Seata)。
- 性能问题:读写分离可以有效提高读操作的性能,但要注意主从同步的延迟问题。
相关文章:
Spring Boot项目中使用Sharding-JDBC实现读写分离
Sharding-JDBC是一个分布式数据库中间件,它不仅支持数据分片,还可以轻松实现数据库的读写分离。下面是如何在Spring Boot项目中集成Sharding-JDBC并实现读写分离的详细步骤: 目录 1. 引入依赖 2. 配置数据源 3. 配置Sharding-JDBC相关参数…...
【网络安全】SSO登录过程实现账户接管
未经许可,不得转载。 文章目录 正文正文 登录页面展示了“使用 SSO 登录”功能: 经分析,单点登录(SSO)系统的身份验证过程如下: 1、启动SSO流程:当用户点击按钮时,浏览器会发送一个GET请求到指定的URL: /idp/auth/mid-oidc?req=[UNIQUE_ID]&redirect_uri=[REDI…...
Admin.NET源码学习(3:LazyCaptcha使用浅析)
Admin.NET项目前端登录页面的验证码图片默认使用动态图,且图形内容为阿拉伯数字运算(如下图所示),用户输入正确的计算结果才能正常登录。项目采用LazyCaptcha模块生成验证码及动态图。 在Admin.NET.Core项目中添加了Lazy.Cap…...
在原生未启用kdump的BCLinux 8系列服务器上启用kdump及报错处理
本文记录了在原生未启用kdump的BCLinux 8系列操作系统的服务器上手动启用kdump服务及报错处理的过程。 一、问题描述 BCLinux 8系列操作系统,系统初始化安装时未启用kdump服务,手动启动时报以下“No memory reserved for crash kernel”或“ConditionK…...
Android架构组件中的MVVM
Android架构组件中的MVVM(Model-View-ViewModel)模式是一种广泛应用的设计模式,它通过将应用程序分为三个主要部分(Model、View、ViewModel)来分离用户界面和业务逻辑,从而提高代码的可维护性、可扩展性和可…...
走向绿色:能源新选择,未来更美好
当前,全球范围内可再生能源正经历着从辅助能源向核心能源的深刻转型,绿色能源日益渗透至居住、出行、日常应用等多个领域,深刻影响着我们的生活方式,使我们能够更加充分地体验清洁能源所带来的优质生活。 一、绿色能源与“住” …...
鸿蒙装饰器的介绍
State装饰器, State装饰的变量,称为状态变量,与声明式范式中的其他被装饰变量一样,是私有的,只能从组件内部访问,在声明时,必须指定其类型和本地初始化。 Provide装饰器和Consume装饰器&#…...
零基础5分钟上手亚马逊云科技核心云架构知识 - 权限管理最佳实践
简介: 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…...
[数据库][知识]SQL Server、MySQL 和 Oracle 的默认端口和数据库链接
SQL Server、MySQL 和 Oracle 的默认端口号、连接 URL 和驱动类名。以下是对每个数据库连接信息的简要说明: SQL Server 默认端口号:1433JDBC URL 格式:jdbc:sqlserver://localhost:1433;DatabaseNamedbnameJDBC 驱动类名:com.mic…...
【Unity教程】使用 Animation Rigging实现IK制作程序化的动画
在 Unity 开发中,为角色创建逼真且自适应的动画是提升游戏体验的关键。在本教程中,我们将结合 Animation Rigging 工具和 IK(Inverse Kinematics,反向运动学)插件来实现程序化的动画。 视频教程可以参考b战大佬的视频 …...
OBS混音器(Mixers)的重要性和配置指南
在进行直播或录制时,音频管理是非常关键的一环,特别是在需要同时处理多个音频源的复杂设置中。OBS Studio提供了强大的音频管理工具,其中“混音器”功能扮演了核心角色。混音器(Mixers)在OBS中用于控制不同音频源的输出路由,允许用户精确控制哪些音源出现在最终的直播或录…...
Ubuntu安装Anaconda3
本文详细阐述了在 Ubuntu 系统中安装 Anaconda3 的完整流程。包括 Anaconda3 安装包的获取途径,具体安装过程中的每一个步骤及注意事项,还有安装后的环境变量设置和安装成功的验证方法。旨在为 Ubuntu 用户提供清晰、易懂且准确的 Anaconda3 安装指南&am…...
数据类型解码:INT、VARCHAR、DATETIME的深度解析与实践
标题:数据类型解码:INT、VARCHAR、DATETIME的深度解析与实践 在软件开发和数据库设计中,数据类型是构建数据模型的基础。准确理解和使用数据类型,如INT、VARCHAR、DATETIME,对于确保数据的完整性、性能和安全性至关重…...
基于单片机的智能晾衣系统设计
摘 要 :在网络信息技术的推动下,智能家居得到了广泛应用,文章根据当前的市场动态,针对基于单片机的智能晾衣系统设计展开论述,具体包括两个方面的内容———硬件设计和软件设计。 关键词 :单片机ÿ…...
Python实战项目:天气数据爬取+数据可视化(完整代码)
一、选题的背景 随着人们对天气的关注逐渐增加,天气预报数据的获取与可视化成为了当今的热门话题,天气预报我们每天都会关注,天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…...
知识改变命运 数据结构【链表面试题】
1. 删除链表中等于给定值 val 的所有节点。 OJ链接 public ListNode removeElements(ListNode head, int val) {if (headnull) {return null;}ListNode curhead.next;ListNode prehead;while(cur!null) {if(cur.valval) {pre.nextcur.next;curcur.next;}else {precur;curcur.ne…...
计算机毕业设计 医院问诊系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
掌握CSS的:any-link伪类:统一链接样式的高效方法
在网页设计中,链接是用户导航和交互的重要组成部分。CSS提供了多种伪类选择器来定义链接的不同状态,例如:link用于选择未访问的链接,:visited用于选择已访问的链接。然而,有时候我们需要同时为所有状态的链接设置统一的样式&#…...
虚幻5|角色武器装备的数据库学习(不只是用来装备武器,甚至是角色切换也很可能用到)
虚幻5|在连招基础上,给角色添加武器并添加刀光|在攻击的时候添加武器并返回背后(第一部分,下一部分讲刀光)_unreal 如何给角色添加攻击-CSDN博客 目的:捡起各种不同的武器,捡起的武器跟装备的武器相匹配 …...
防火墙技术与地址转换
文章目录 前言一、四种区域二、实验拓扑图基础配置防火墙配置测试结果 前言 防火墙是计算机网络中的一种安全设备或软件功能,旨在监控和控制进出网络的网络流量。其核心目的是保护内部网络免受外部攻击或不必要的访问。防火墙通过设定一系列安全规则,允…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
