分布式系统常用的三注解:@DS,@DistributeLock,@GlobalTransactional【开发实践】

文章目录

  • 一、多数据源的动态切换:@DS
    • 1.1 多数据源的背景
      • 1.1.1 主从复制
      • 1.1.2 读写分离
      • 1.1.3 分库分表
    • 1.2 @DS的使用流程
      • 1.2.1 添加依赖
      • 1.2.2 配置数据源
      • 1.2.3 使用 @DS 切换数据源
    • 1.3 使用@DS切换数据源失效
      • 1.3.1 情形二:同类中的方法调用@DS方法
      • 1.3.2 情形一:@Transactional方法调用@DS方法
  • 二、分布式锁:@DistributeLock
    • 2.1 分布式锁的作用
    • 2.2 @DistributeLock的关键参数
  • 三、分布式事务:@GlobalTransactional
    • 2.1 分布式事务的作用
    • 2.2 @GlobalTransactional的关键参数
    • 2.3 @GlobalTransactional与@DistributeLock同时使用
    • 2.4 @GlobalTransactional原理
  • 参考链接

一、多数据源的动态切换:@DS

1.1 多数据源的背景

1.1.1 主从复制

主从复制是一种数据库管理技术,通过将主服务器中的数据变更同步到从服务器上,来实现数据冗余和负载均衡。一般采用一主多从的方案,有时候也会采用多主多从的方案。主从复制的数据同步存在一定延迟。

1.1.2 读写分离

读写分离是一种基于主从复制的数据库读写策略,在应用程序层面(如在代码中或使用中间件)区分读写操作,主节点负责所有的写操作(增、删、改)和实时性较高的读操作(查),从节点负责实时性较低的读操作。在读多写少的情境下,读写分离能提升读取性能(读写分离后避免了读写锁的开销)和实现读负载均衡(使用多个从节点负责读取操作)。

1.1.3 分库分表

分库:单个服务器的磁盘存储容量和CPU处理能力是有极限的,随着存储数据量的增大或请求并发数的增多,单个服务器将无法满足需求。此时可以将原本存储在一个数据库中的数据分散到多个数据库实例中,通过分库来分散单个数据库的存储压力和访问请求,提高系统的可用性和并发处理能力。

分表:对于单张表,随着表中总记录行数的增大,底层B+树的层数也会增大,导致平均访问时延增大。此时可以将原本存储在一张表中的记录分散到多张表中,通过分表来减小单张表中的记录行数,提升访问速度。

1.2 @DS的使用流程

1.2.1 添加依赖

	<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${version}</version></dependency>

1.2.2 配置数据源

spring:datasource:dynamic:primary: masterstrict: falsedatasource:master:url: jdbc:mysql://xx.xx.xx.xx:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_1:url: jdbc:mysql://xx.xx.xx.xx:3307/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_2:url: ENC(xxxxx)username: ENC(xxxxx)password: ENC(xxxxx)driver-class-name: com.mysql.jdbc.Driver

1.2.3 使用 @DS 切换数据源

没有使用@DS时使用默认数据源(primary指定的数据源)。
@DS可以作用于Service实现类上或类中的方法上,参数值为指定数据源所配置的库名。


@Service
@DS("master")
public class UserServiceImpl implements UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;public List selectAll() {return jdbcTemplate.queryForList("select * from user");}@Override@DS("slave_1")public List selectByCondition() {return jdbcTemplate.queryForList("select * from user where age >10");}
}

1.3 使用@DS切换数据源失效

1.3.1 情形二:同类中的方法调用@DS方法

@DS是基于AOP实现的,底层使用的是动态代理。同类中的方法调用属于直接方法调用,不走代理对象,所以不会触发代理逻辑,导致@DS失效。

简单的做法是让调用者和被调用者处于不同类中。另一种做法是在类中注入本类的代理对象,然后在调用本类中被增强了的方法时,使用代理对象来调用。

1.3.2 情形一:@Transactional方法调用@DS方法

@Transactional@DS都是基于AOP实现的,底层使用的是动态代理@Transactional方法调用@DS方法,若采用的是默认的事务传播行为,会导致@DS方法的数据源失效,使用的是外层的@Transactional方法的数据源。

解决办法是在内外方法都使用@Transactional,并且事务的传播行为都选择为Propagation.REQUIRES_NEW,此时内层方法上的@DS可以生效。

二、分布式锁:@DistributeLock

2.1 分布式锁的作用

确保在分布式环境下对于某个资源或操作的并发访问能够按照预期的互斥原则执行。它帮助避免多线程或多服务实例间的并发冲突,保证数据的一致性和完整性。

2.2 @DistributeLock的关键参数

@DistributeLock(keyPrefix = "oms-again-order", keyName = "#req.orderCode", timeOutMSec = 5000, expireMSecs = 5000)

  • keyPrefix:键前缀,主要用于区分不同业务,一般使用业务名作为键前缀。
  • keyName:键名,和键前缀一起作为锁的唯一标识符,一般使用业务相关的id。
  • timeOutMSec:获取锁超时时间,即尝试获取锁时能够等待的最长时间,避免因获取不到锁而长期阻塞,超时返回后可以报错或重试。
  • expireMSecs:锁的过期时间,无论是否完成了其保护的业务操作,锁都会在指定的毫秒数后自动失效并释放,避免因锁无法释放导致进死锁。

三、分布式事务:@GlobalTransactional

2.1 分布式事务的作用

分布式事务是指跨越多个分布式系统或服务的事务操作,需要保证这些操作作为一个整体,要么全部成功,要么全部失败,以此来维护数据的一致性和完整性。

2.2 @GlobalTransactional的关键参数

@GlobalTransactional(name = "oms-again-order", rollbackFor = Exception.class)

  • name:全局事务名称,用于事务的识别和跟踪。
  • rollbackFor:回滚条件,一般为Exception.class或Throwable.class。
  • timeoutMills:设置全局事务的超时时间(毫秒)。如果事务在这段时间内没有完成,将会被系统自动回滚。这个参数有助于防止事务长时间挂起,影响系统性能。

2.3 @GlobalTransactional与@DistributeLock同时使用

并非所有业务都需要同时使用@DistributeLock@GlobalTransactional,前者用于解决并发环境下的互斥问题,后者用于实现一组操作的一致性和完整性。

需要同时使用时,建议@DistributeLock要在@GlobalTransactional之前使用(非必须)。这样会先获取到分布式锁后再开启分布式事务。如果顺序相反,那么会先开发分布式事务再获取分布式锁,迟迟没有获取到锁,会当分布式事务一致等待,可能导致分布式事务超时。

2.4 @GlobalTransactional原理

全局事务由多个本地事务和一张表实现,其中表记录的是已提交的本地事务的XID。若所有的本地事务都成功提交,那么全局事务也成功提交了;若存在一个本地事务失败,那么全局事务就会根据表来查询出已提交的本地事务,将这些事务回滚,从而实现全局事务的回滚。

参考链接

Dynamic-Datasource官网
@DS注解在事务中实现数据源的切换 / @DS在事务中失效

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

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

相关文章

关于Golang中自定义包的简单使用-Go Mod

1. go env 查看 GO111MODULE 是否为 on&#xff0c;不是修改成on go env -w GO111MODULEon 2 .自定义包的目录格式 3. test.go 内容 package calc func Add(x, y int) int { // 首字母大写表示公有方法return x y }func Sub(x, y int) int {return x - y } 4.生成calc目…

CORSscannerburp的插件jsonp-hunterdnsub

1.CORSscanner 下载地址&#xff1a;CORScanner: Fast CORS misconfiguration vulnerabilities scanner 有时候会出一些警告没引入变量之类的&#xff0c;用pip安装一下就可以了 打开之后是这样的 2.jsonp-hunter 安装jython&#xff1a;Jython的安装和配置环境_jython安装…

前后端分离与实现 ajax 异步请求 和动态网页局部生成

前端 <!DOCTYPE html><!-- 来源 --> <!-- https://cloud.tencent.com/developer/article/1705089 --> <!-- https://geek-docs.com/ajax/ajax-questions/19_ajax_javascript_send_json_object_with_ajax.html --> <!-- 配合java后端可以监听 --&…

最新OpenAI免费API-openai api key获取方式

最近又开始准备LLM 应用开发&#xff0c;要用到api key&#xff0c;才发现过我之前免费发放的额度没了&#xff01;我都没咋用过&#xff0c;痛心&#x1f62d;&#x1f62d;&#x1f62d;&#xff01; 现在 OpenAI 有要求必须充值 5 刀才能使用&#xff0c;问就是没钱&#x…

Leetcode-438-找到字符串中所有的字母异位词

题目说明 给定一个字符串 s 和一个非空字符串 p&#xff0c;找到 s 中所有是 p 的字母异位词的子串&#xff0c;返回这些子串的起始索引。 字符串只包含小写英文字母&#xff0c;并且字符串 s 和 p 的长度都不超过 20100。 说明&#xff1a; 字母异位词指字母相同&#xff…

前端面试指南(一面)

知识点梳理 变量类型 ECMAScript 中定义了 6 种原始类型&#xff1a; 6种: Boolean String Number Null Undefinded Symbol 注意&#xff1a;原始类型不包含 Object。 typeof typeof xxx得到的值有以下几种类型&#xff1a;undefined boolean number string object function、…

除visio以外的几款好用流程图绘制工具

流程图绘制软件在嵌入式软件开发中扮演着重要的角色&#xff0c;它们能够帮助用户清晰、直观地展示工作流程。以下是几款流行的流程图绘制软件及其特点的详细报告&#xff1a; 思维导图MindMaster MindMaster作为一款专业的思维导图软件&#xff0c;不仅具备强大的思维导图制作…

硕士课程 可穿戴设备之作业一

作业一 第一个代码使用的方法是出自于[1]。 框架结构 如下图&#xff0c;不过根据对代码的解读&#xff0c;发现作者在代码中省去了对SSR部件的实现&#xff0c;下文再说。 Troika框架由三个关键部件组成&#xff1a;信号分解&#xff0c;SSR和光谱峰值跟踪。&#xff08;粗…

游戏缺失xinput1_3.dll怎么修复,总结几种有效的修复方法

在现代科技日新月异的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;由于各种原因&#xff0c;电脑可能会出现一些错误或问题&#xff0c;其中之一就是找不到xinput13.dll文件&#xff0c;这个问题会导致软件或者游戏无法正常启动运行&#xf…

面试 Redis 八股文十问十答第二期

面试 Redis 八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;redis 一般都用在什么场景…

搜维尔科技:使用Touch 触觉力反馈设备,用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中

使用Touch 触觉力反馈设备&#xff0c;用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中 搜维尔科技&#xff1a;使用Touch 触觉力反馈设备&#xff0c;用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中

文件编码概念

文件的读取 open()函数&#xff1a; 打开一个已存在的文件&#xff0c;或者创建一个新文件 open(name,mode,encoding) name:是要打开的目标文件名的字符串&#xff08;可以包含文件所在的具体路径&#xff09; mode:设置打开文件的模式&#xff08;访问模式&#xff09;&am…

C语言—字符函数和字符串函数

1.字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件 ctype.h。 例&#xff1a;将一句话中的小写字母改成大写字母。 2.字符转换函数 头文件&#xff1a;ctype.h C语言提供了2…

【数据集划分】假如你有超百万条oracle数据库数据(成真版)

【数据集划分】假如你有接近百万条oracle数据库数据&#xff08;成真版&#xff09; 写在最前面小结 数据集划分原因注意事项 1. 留出法&#xff08;Hold-out Method&#xff09;原理算法复杂度代码示例Scikit-learn的train_test_split分布式计算框架&#xff08;如Apache Spar…

JVMの垃圾回收

在上一篇中&#xff0c;介绍了JVM组件中的运行时数据区域&#xff0c;这一篇主要介绍垃圾回收器 JVM架构图&#xff1a; 1、垃圾回收概述 在第一篇中介绍JVM特点时&#xff0c;有提到过内存管理&#xff0c;即Java语言相对于C&#xff0c;C进行的优化&#xff0c;可以在适当的…

DRIVEN|15分的CNN+LightGBM怎么做特征分类,适用于转录组

说在前面 今天分享一篇做深度学习模型的文章&#xff0c;这是一篇软硬结合的研究&#xff0c;排除转换实体产品&#xff0c;我们做生信基础研究的可以学习模仿这个算法&#xff0c;适用且不局限于临床资料&#xff0c;转录组数据&#xff0c;GWAS数据。 今天给大家分享的一篇文…

用香橙派AIpro部署大模型、安装宝塔搭建私有随身WEB开发环境

什么是香橙派 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板&#xff0c;其搭载了昇腾 AI 处理器&#xff0c;可提供 8TOPS INT8 的计算能力&#xff0c;内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算&#xff0c;可广泛…

【路径规划】基于蚁群算法ACO促进水果检测数据集的获取附matlab代码

% 初始化蚁群算法参数 num_ants 20; % 蚂蚁数量 num_iterations 100; % 迭代次数 alpha 1; % 信息素重要程度参数 beta 2; % 启发式信息重要程度参数 rho 0.5; % 信息素挥发率 Q 1; % 信息素增加量 pheromone_initial 0.1; % 初始信息素浓度 num_nodes 100; % 图中节点…

JL-8B/2211电流继电器 带板前接线底座 约瑟JOSEF

JL-8集成电路电流继电器 系列型号 JL-8A/11集成电路电流继电器;JL-8B/11集成电路电流继电器; JL-8A/12集成电路电流继电器;JL-8B/12集成电路电流继电器; JL-8A/13集成电路电流继电器;JL-8B/13集成电路电流继电器; JL-8A/21集成电路电流继电器;JL-8B/21集成电路电流继电器; JL-…

Mamba v2诞生:1 儒(Transformers)释(SSD)道(Mamba)本是一家?!

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…