SpringBoot 手动实现动态切换数据源 DynamicSource (中)

大家好,我是此林。

SpringBoot 手动实现动态切换数据源 DynamicSource (上)-CSDN博客

在上一篇博客中,我带大家手动实现了一个简易版的数据源切换实现,方便大家理解数据源切换的原理。今天我们来介绍一个开源的数据源切换框架,是baomidou 旗下和 Mybatis-plus 同级的开源框架:dynamic-datasource-spring-boot-starter。

1. 简介

dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。

其支持 Jdk 1.7+, SpringBoot 1.5.x 2.x.x 3.x.x
JPA用户不建议使用,JPA自带事务,无法连续切库。

2. 使用

下面基于SpringBoot2 做演示。

1.pom.xml

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

2.application.yml

spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://192.168.183.128:3306/userusername: rootpassword: 123456slave_1:url: jdbc:mysql://192.168.183.128:3307/userusername: rootpassword: 123456slave_2:url: jdbc:mysql://192.168.183.128:3308/userusername: rootpassword: 123456

参数说明:

以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2

后续我们会使用AOP注解的方式指定数据源。

例如:@DS("master")、@DS("slave")

  1. 配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。
  2. 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。

例如:当我们使用@DS("slave")时,指定了组名  “slave”,那么它会采用负载均衡算法自动切换数据源。

因为我们后续希望实现Mysql主从读写分离,所有写操作走master数据库,所有读操作走slave从数据库。

3. 使用 @DS 切换数据源。

@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic void insert(User user) {userMapper.insert(user);}@Override@DS("slave_1")public List<User> selectAll() {userMapper.selectAll();}@Override@DS("slave")public User selectById(Integer id) {return userMapper.selectById(id);}
}

说明:

insert() 方法没有加@DS,默认使用master数据库。

selectAll() 方法指定使用数据源slave_1

selectById() 使用slave组,自动负载均衡查询。

注:@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解

若要实现Mysql主从自动复制,还需要配置mysql主从复制,详情参考博客:

ShardingSphere5:Mysql主从集群搭建、读写分离_shardingsphere mysql读写分离-CSDN博客

其中SpringBoot配置 ShardingSphere5 这一块不用管,Mysql主从集群搭建是不变的。

4.其他实现

3. 底层原理

1. SpringBoot自动配置

我们找到 DynamicDataSourceAutoConfiguration.class。 这是框架的自动配置类。

这一段是从我们配置的application.yml 读取并设置相关属性,也就是我们配置的数据源信息。

具体的话,是赋值给 DynamicRoutingDataSource 这个对象。

2. 扫描@DS注解

这是 DynamicDataSourceAnnotationInterceptor 的 invoke 方法,典型的AOP。

在所有加了@DS的方法上,

1. 当执行目标方法的时候,会先获取到@DS("XXX")中数据源的名称,dsKey。

2. 然后再把dsKey 存到ThreadLocal中,也就是图中的DynamicDataSourceContextHolder。

3. 最后再开始执行目标方法。

3. DynamicRoutingDataSource

回到我们之前自动配置里说的 DynamicRoutingDataSource

观察 DynamicRoutingDataSource 的继承关系链,发现它实现了Spring的 DataSource 和 InitializingBean 接口。

这和我们上一篇博客手动实现数据源切换的思路是一样的。

在 DynamicRoutingDataSource 里,determineDataSource 从 ThreadLocal 里 获取到指定数据源名称

最后通过名称返回对应的DataSource数据源。

对比上一篇博客,

SpringBoot 手动实现动态切换数据源 DynamicSource (上)-CSDN博客

其实思路大差不差,只不过 dynamic-datasource-spring-boot-starter 更加完善,增加了AOP注解功能。

4. 无注解切换数据源

1. 自定义切面,结合 DynamicDatasourceNamedInterceptor ,对于所有以 select 方法开头的,设置使用 slave 数据源, 对于add、update、delete 开头的使用 master 数据源。

2. 自定义 Mybatis 拦截器,对于所有的写操作使用 master 数据源,所有读操作使用 slave 数据源。(即:把数据源标识写入 DynamicDataSourceContextHolder 中)。

3. 其他场景:SaaS多租户系统下,每个租户使用独立的数据库,那么可以要求前端携带请求头 “dsKey”。配置自定义拦截器,拦截请求,把dsKey 写入 DynamicDataSourceContextHolder。

今天的分享就到这里。

我是此林,关注我吧,带你看不一样的世界!

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

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

相关文章

前端学习一

一 进程与线程 线程是进程执行的最小单位&#xff0c;进程是系统分配任务的最小单位。 一个进程可执行最少一个线程。线程分为子线程和主线程。 主线程关闭则子线程关闭。 二 浏览器进程 浏览器是多进程多线程应用。 进程包括&#xff1a; 浏览器进程 负责程序交互渲染…

EasyExcel 动态设置表格的背景颜色和排列

项目中使用EasyExcel把数据以excel格式导出&#xff0c;其中设置某一行、某一列单元格的背景颜色、排列方式十分常用&#xff0c;记录下来方便以后查阅。 1. 导入maven依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easy…

概率论得学习和整理23:EXCEL 数据透视表基础操作

目录 1 选择数据&#xff0c;插入数据透视表 2 选择数据透视表生成位置 3 出现了数据透视表的面板 4 数据透视表的基本结构认识 4.1 交叉表/列联表 4.2 row, column, cell 一个新增的筛选器&#xff0c;就这么简单 4.3 可以只添加 rowcell/值 &#xff0c;也可以colu…

计算机网络从诞生之初到至今的发展历程

前言 "上网"&#xff0c;相信大家对这个动词已经不再陌生&#xff0c;网 通常指的是网络&#xff1b;在 2024 年的今天&#xff0c;网络已经渗透到了每个人的生活中&#xff0c;成为其不可或缺的一部分&#xff1b;你此时此刻在看到我的博客&#xff0c;就是通过网络…

GB28181系列三:GB28181流媒体服务器ZLMediaKit

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、ZLMediaKit介绍 二、 ZLMediaKit安装、运行(Ubuntu) 1、安装 2、运行 3、配置 三、ZLMediaKit使用 一、ZLMediaKit介绍 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架&#xff0c;项目地址&#xf…

iPhone恢复技巧:如何从 iPhone 恢复丢失的照片

在计算机时代&#xff0c;我们依靠手机来捕捉和存储珍贵的回忆。但是&#xff0c;如果您不小心删除或丢失了手机上的照片怎么办&#xff1f;这真的很令人沮丧和烦恼&#xff0c;不是吗&#xff1f;好吧&#xff0c;如果您在 iPhone 上丢失了照片&#xff0c;您不必担心&#xf…

如何将你的 Ruby 应用程序从 OpenSearch 迁移到 Elasticsearch

作者&#xff1a;来自 Elastic Fernando Briano 将 Ruby 代码库从 OpenSearch 客户端迁移到 Elasticsearch 客户端的指南。 OpenSearch Ruby 客户端是从 7.x 版 Elasticsearch Ruby 客户端分叉而来的&#xff0c;因此代码库相对相似。这意味着当将 Ruby 代码库从 OpenSearch 迁…

Day8 神经网络中的导数基础

Day8 神经网络中的导数基础 导数的定义 导数&#xff08;Derivative&#xff09;是微积分中的一个核心概念&#xff0c;用于描述函数在某一点的变化率。简单来说&#xff0c;导数就是函数值随自变量微小变化而产生的变化量&#xff0c;即斜率或变化率。假设有一个函数 f ( x…

【视频生成模型】——Hunyuan-video 论文及代码讲解和实操

&#x1f52e;混元文生视频官网 | &#x1f31f;Github代码仓库 | &#x1f3ac; Demo 体验 | &#x1f4dd;技术报告 | &#x1f60d;Hugging Face 文章目录 论文详解基础介绍数据预处理 &#xff08;Data Pre-processing&#xff09;数据过滤 (Data Filtering)数据标注 (Data…

52 基于单片机的超声波、温湿度、光照检测分阶段报警

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 1.通过DHT11模块读取环境温度和湿度: 2.将湿度、障碍物距显示在lcd1602上面&#xff0c;第一行显示温度和湿度,格式为:xxCyy%&#xff0c;第二行显示超声波传感器测得的距离&#xff0c;格式为:Di…

大数据与AI:从分析到预测的跃迁

引言&#xff1a;数据时代的新纪元 从每天的社交分享到企业的运营决策&#xff0c;数据早已成为现代社会不可或缺的资源。我们正置身于一个数据爆炸的时代&#xff0c;数以亿计的信息流实时生成&#xff0c;为人类带来了前所未有的洞察能力。然而&#xff0c;数据的价值并不仅限…

3D视觉[一]3D计算机视觉

3D视觉[一]3D计算机视觉 3D计算机视觉概述 像机标定 文章目录 3D视觉[一]3D计算机视觉前言一、人类视觉二、计算机视觉2.1 计算机视觉的研究目的2.2 计算机视觉的研究任务2.3 计算机视觉的研究方法2.4 视觉计算理论2.5 马尔框架中计算机视觉表达的四个层次2.5.1 图像&#xff…

OpenCV目标检测 级联分类器 C++实现

一.目标检测技术 目前常用实用性目标检测与跟踪的方法有以下两种&#xff1a; 帧差法 识别原理&#xff1a;基于前后两帧图像之间的差异进行对比&#xff0c;获取图像画面中正在运动的物体从而达到目标检测 缺点&#xff1a;画面中所有运动中物体都能识别 举个例子&#xf…

QT从入门到精通(二) ——信号与槽机制

Qt 的信号与槽机制&#xff08;Signal and Slot&#xff09;是 Qt 框架 中用于对象间通信的核心机制之一。它允许对象之间进行松耦合的事件驱动式通信&#xff0c;尤其适合 GUI 应用程序 中的事件处理。 1. 基本概念 信号 (Signal) 当对象的状态发生变化时&#xff0c;它会发…

如何使用git新建本地仓库并关联远程仓库的步骤(详细易懂)

一、新建本地仓库并关联远程仓库的步骤 新建本地仓库 打开终端&#xff08;在 Windows 上是命令提示符或 PowerShell&#xff0c;在 Linux 和Mac上是终端应用&#xff09;&#xff0c;进入你想要创建仓库的目录。例如&#xff0c;如果你想在桌面上创建一个名为 “my - project”…

1Panel应用推荐:MaxKB开源知识库问答系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

element plus的table组件,点击table的数据是,会出现一个黑色边框

在使用 Element Plus 的 Table 组件时&#xff0c;如果你点击表格数据后出现了一个黑色边框&#xff0c;这通常是因为浏览器默认的焦点样式&#xff08;outline&#xff09;被触发了。如图&#xff1a; 你可以通过自定义 CSS 来隐藏这个黑色边框&#xff0c;代码如下&#xff1…

泷羽sec学习打卡-brupsuite7搭建IP炮台

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-Brup-IP炮台搭建 搭建炮台服务端安装zmap1、更新系统和安装基础依赖&#xff…

赫布定律 | 机器学习 / 反向传播 / 经验 / 习惯

注&#xff1a;本文为 “赫布定律” 相关文章合辑。 未整理。 赫布定律 Hebb‘s law 馥墨轩 2021 年 03 月 13 日 00:03 1 赫布集合的基本定义 唐纳德・赫布&#xff08;Donald Hebb&#xff09;在 1949 年出版了《行为的组织》&#xff08;The Organization of Behavior&a…

各个数据库优劣势对比

1.关系型数据库&#xff08;RDBMS&#xff09; 优势&#xff1a; • 数据一致性&#xff1a;通过严格的事务处理和ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性&#xff0c;确保数据的一致性和完整性。 • 易于理解和使用&#xff1a;关系型数据库的表结构…