Spring Boot 进阶-SpringBoot如何整合多数据源场景

ops/2024/10/9 13:10:17/

在这里插入图片描述
  对多数据源大家应该不陌生,一般的在单个应用都会存在一个数据库,一个文件存储。这里所说的数据库就是我们描述的数据源。那么多数据源的意思其实通俗来讲就是在一个单体应用中存在两个以上的数据库。这个时候就需要我们对多个数据源进行分别对待进行处理了。

理解多数据源的概念

  在之前的文章中我们了解了在Spring Boot如何整合单个数据源,并且我们也提到了数据源整合时候的原理。下面我们就依托于之前提到的原理来构建我们的多数据源应用。

  之前文章结尾的时候我们提到了在整合Druid数据库连接池的时候,在MyBatis自动注入的注解上有如下一个配置。

java">@ConditionalOnSingleCandidate(DataSource.class)

  而对于@ConditionalOnSingleCandidate注解,我们在讲条件注解的时候曾经提及到,它的意思就是在容器中只有一个DataSource实例的时候,这个自动配置类才会被加载生效。这就与我们上面提到的概念相互冲突了。为什么这么说呢?

  因为根据这个注解的意思,容器中只能存在一个数据源,如果需要多个数据源那就不能使用MyBatis框架来进行整合了。那岂不是什么事情都干不了呢?根据字面的意思是可以这样理解的,但是实际上并不是这样。

  多数据源的意思其实并不是在同一时刻有多个数据源同时被操作。在Spring框架中,提供了一个AbstractRoutingDataSource的类,根据字面意思,是用来进行数据源路由的,路由的意思就是相互之间可以切换。也就是说可以实现数据源之间的动态切换操作。所以被称为是动态数据源操作。所以这里MyBatis框架所支持其实是一个动态数据源的切换而不是想我们所理解的在同一时刻多个数据源共同操作的场景。

  既然理解到这里了?那么我们就来研究一下在Spring Boot中如何去实现动态数据源。

动态数据源

  根据上面的意思,动态数据源首先能做的事情就是可以实现自由路由操作。也就是说可以随时切换到其中的一个数据源上。在Spring框架中提供了AbstractRoutingDateSource这样一个类。其源码如下

java">public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {@Nullableprivate Map<Object, Object> targetDataSources;

  会看到在这个类中有如下一个属性。

java">private Map<Object, Object> targetDataSources;

  这个属性是一个Map结构,也就是说可以用KV键值对来表示。其中K表示需要切换的规则,而V则表示所要切换的数据源。

  自习研究这个类我们会发现在这个抽象类中大部分的方法都被实现了,但是唯独在结束的时候有如下这样一个方法没有被实现。需要等待其继承类来实现

java">/*** Determine the current lookup key. This will typically be* implemented to check a thread-bound transaction context.* <p>Allows for arbitrary keys. The returned key needs* to match the stored lookup key type, as resolved by the* {@link #resolveSpecifiedLookupKey} method.*/@Nullableprotected abstract Object determineCurrentLookupKey();

  根据上面的英文描述结合自己的理解,我们可以知道,这个的返回值就决定了我们需要切换的数据源所选择的Key是什么。也就是说我们通过这里获取到Key从targetDataSources中获取到对应的数据源的值。

  到这里我们就很容易理解数据源的切换逻辑,并且很好的理解动态数据源在SpringBoot中是如何实现的了?那么既然数据源是属于一个共享资源,那么我们就必须要去考虑到多线程线程安全的问题?在Spring Boot中是如何保证数据源线程安全的呢


http://www.ppmy.cn/ops/123195.html

相关文章

openpnp - 图像传送方向要在高级校正之前设置好

文章目录 openpnp - 图像传送方向要在高级校正之前设置好笔记图像传送方向的确定END openpnp - 图像传送方向要在高级校正之前设置好 笔记 图像传送方向和JOG面板的移动控制和实际设备的顶部摄像头/底部摄像头要一致&#xff0c;这样才能和贴板子时的实际操作方向对应起来。 …

python 实现algorithm topo卡恩拓扑算法

algorithm topo卡恩拓扑算法介绍 卡恩拓扑算法&#xff08;也称为Kahn算法或Kahn’s Topological Sort Algorithm&#xff09;是一种用于对有向无环图&#xff08;DAG&#xff09;进行拓扑排序的经典算法。拓扑排序是将有向无环图的节点按照依赖关系进行排序的过程&#xff0c…

el-input 限制输入框只能输入数字和小数以及表单常用的校验规则

目录 1、纯输入框使用 2、form表单输入框使用 3、前端Vue中常用rules校验规则 1、纯输入框使用 方法一&#xff1a; oninput “valuevalue.replace(/[^\d]/g,‘’)” //只能输入数字 oninput “valuevalue.replace(/[^0-9.]/g,‘’)” //只能输入数字和小数 <el-inp…

报错 - llama-index pydantic error | arbitrary_types_allowed | PydanticUserError

国庆节前使用 LiteLLMEmbedding 设置 llama-index Settings.embed_model 还好好的&#xff0c;回来后&#xff0c;就就报错&#xff0c;试着降级 llama-index 也无用&#xff1b;设置 Settings.llm 也是好好地。 解决方法&#xff1a;conda 重新创建环境后&#xff0c;在安装 …

Hive数仓操作(十六)

DML&#xff08;数据操作语言&#xff09;指的是用于操作数据的 SQL 语言部分&#xff0c;主要包括对数据的插入、更新、删除等操作。Hive 的 DML语句主要包括 INSERT、UPDATE 和 DELETE 。以下是一些重要的 Hive DML 语句及其解析。 Hive的DML语句 一、 插入操作INSERT 一般…

过滤器Filter【详解】

过滤器Filter 1、 现有问题 在以往的Servlet中&#xff0c;有冗余的代码&#xff0c;多个Servlet都有重复的代码 比如编码格式设置 登录信息认证 2、 概念 过滤器&#xff08;Filter&#xff09;是处于客户端与服务器目标资源之间的一道过滤技术。 过滤器 3、 过滤器作用 执…

Databinding(kotlin)

简单使用&#xff08;只作为view获取&#xff09; build.gradle.kts配置 android {dataBinding {enable true}}activity注入 //setContentView(R.layout.activity_main) val binding: ActivityMainBinding DataBindingUtil.setContentView(this, R.layout.activity_main)x…

【预备理论知识——2】深度学习:线性代数概述

简单地说&#xff0c;机器学习就是做出预测。 线性代数 线性代数是数学的一个分支&#xff0c;主要研究向量空间、线性方程组、矩阵理论、线性变换、特征值和特征向量、内积空间等概念。它是现代数学的基础之一&#xff0c;并且在物理学、工程学、计算机科学、经济学等领域有着…