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

news2024/11/23 11:55:47

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

理解多数据源的概念

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

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

@ConditionalOnSingleCandidate(DataSource.class)

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

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

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

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

动态数据源

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

public abstract class AbstractRoutingDataSource 
  extends AbstractDataSource implements InitializingBean {
   

   @Nullable
   private Map<Object, Object> targetDataSources;

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

private Map<Object, Object> targetDataSources;

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

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

/**
	 * 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.
	 */
	@Nullable
	protected abstract Object determineCurrentLookupKey();

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

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

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

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

相关文章

[Algorithm][贪心][整数替换][俄罗斯套娃信封问题]详细讲解

目录 1.整数替换1.题目链接2.算法原理详解1.解法一2.解法二 3.代码实现1.代码一2.代码二 2.俄罗斯套娃信封问题1.题目链接2.算法原理详解1.解法一2.解法二 3.代码实现1.代码一2.代码二 1.整数替换 1.题目链接 整数替换 2.算法原理详解 1.解法一 思路&#xff1a;模拟(递归 …

unity学习-渲染优化

cpu与gpu的区别 cpu&#xff1a;什么都干&#xff0c;主要处理代码的逻辑与传递信息&#xff0c;将需要DrewCall传递进gpu gpu&#xff1a;主要处理渲染方面&#xff0c;实现DrewCall 层级细节LOD技术 我们在unity中一个模型如果距离远了看起来就会模糊&#xff0c;但是它实…

独家揭秘!成为CSDN人工智能优质创作者:我的故事和心得

你好&#xff0c;我是三桥君 晚上我打开消息中心提醒发现&#xff0c;CSDN官方博客居然关注我了&#xff01;我又喜又惊&#xff01;喜是官方博客也认可我了&#xff01;惊是为啥关注我嘞&#xff1f; 突然想到&#xff0c;国庆放假前一天下午&#xff0c;我申请了“创作者认证…

GNURadio 平台实现SSB信号调制解调

目录 一、SSB 信号调制解调原理 二、搭建的GRC流图 一、SSB 信号调制解调原理 1.SSB调制原理 DSB信号虽然相比AM信号节约了功率利用率&#xff0c;但是信号带宽与AM信号一样&#xff0c;是基带信号最大频率的2倍。DSB信号上下边带信号完全一样&#xff0c;传递信息一样&…

Android Studio New里面没有New Flutter Project

跟着Flutter中文网的配置教程&#xff0c;安装好了flutter,在Android studio里面也安装了dart和flutter的插件。重启后还是在FIle->New里面没有显示New Flutter Project。 反复卸载重装dart和flutter插件好几次&#xff0c;依然没有效果。 原来是没有把Android APK Suppor…

收银台实现iframe跨页面调用函数的方法——未来之窗行业应用跨平台架构

一、访问子页面 window.frames["子frame名称"].函数(); window.frames["子frame名称"].未来之窗_人工智能_并行传送阵(t,u,N,); 二、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技…

要在 Git Bash 中使用 `tree` 命令,下载并手动安装 `tree`。

0、git bash 安装 git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作) 1、下载并手动安装 tree 下载 tree.exe 从 tree for Windows 官方站点 下载 tree 的 Windows 可执行文件。tree for Window&#xff1a;https://gnuwin32.source…

ubuntu安装HALCON-23.11-Progress新版本

问题描述 halcon最近升级了&#xff0c;领导希望我将halcon升级成最新版本&#xff0c;由此记录升级过程。之前在我的电脑上安装了20.11-steady版本&#xff0c;在不卸载之前版本的前提下&#xff0c;让两个版本共存。 1.官网下载安装包 官网链接: https://www.mvtec.com/pr…

windows C++-创建图像处理的异步消息(三)

完整实例 以下代码显示完整示例是基于wmain 函数和 GDI 库&#xff0c;并调用 ProcessImages 函数以处理 默认目录中的 JPEG 文件。 // image-processing-network.cpp // compile with: /DUNICODE /EHsc image-processing-network.cpp /link gdiplus.lib #include <windo…

制造企业MES管理系统的应用策略与实施路径

在智能制造浪潮的席卷之下&#xff0c;MES管理系统作为连接生产计划与车间操作的核心桥梁&#xff0c;其战略地位愈发显著。本文旨在深入剖析MES管理系统在智能制造转型中的核心价值、实施策略及实践路径&#xff0c;为制造企业探索智能化生产之路提供实践指导与灵感启发。 MES…

火山引擎边缘智能亮相“地瓜机器人开发者大会”,推动端侧大模型应用与落地

9 月 20 日&#xff0c;2024 地瓜机器人开发者日暨新品发布在深圳科创学院南山总部成功举办&#xff0c;火山引擎边缘智能受邀出席此次会议。会议以“加速智能生长”为主题&#xff0c;发布了地瓜机器人新一代机器人开发者套件 RDK X5 &#xff0c;同时&#xff0c;会议汇聚了中…

Puppeteer自动化:使用JavaScript定制PDF下载

引言 在现代的Web开发中&#xff0c;自动化已经成为提高效率和减少重复劳动的重要手段。Puppeteer 是一个强大的Node.js库&#xff0c;提供了对无头Chrome或Chromium的控制&#xff0c;可以用于生成网页快照、抓取数据、自动化测试等任务。其中&#xff0c;生成PDF文件是一个常…

【TOP K】leetcode 215.数组中第K个最大的元素

1 题目描述 题目链接&#xff1a;数组中第K个最大的元素 2 题目解析 首先区分 第K个最大的元素和 第K个不同的元素 考虑使用什么数据结构&#xff1f; 使用堆的数据结构&#xff0c;可以使用priority_queue&#xff0c;然后 建大堆&#xff0c;这样大的元素就在前面。接着…

爬虫案例——爬取腾讯社招

案例需求&#xff1a; 1.爬取腾讯社招的数据&#xff08;搜索 | 腾讯招聘&#xff09;包括岗位名称链接时间公司名称 2.爬取所有页&#xff08;翻页&#xff09; 3.利用jsonpath进行数据解析 4.保存数据&#xff1a;txt文本形式和excel文件两种形式 解析&#xff1a; 1.分…

9.16贪心算法

定义&#xff1a;贪心算法是一种逐步构建解决方案的算法&#xff0c;每次选择当前最优的局部解&#xff0c;期望通过局部最优解的累积&#xff0c;最终获得全局最优解​​​​​​典型例题&#xff1a; 1.找零问题--蓝桥云课 解决方案&#xff1a;先找大额&#xff0c;再找小额…

FreeRTOS学习笔记内置部分公司面试题目(更新中)

1. 简介 1.1 RTOS简介 RTOS(实时操作系统)是指一类系统&#xff0c;如 FreeRTOS&#xff0c;uC/OS&#xff0c;RTX&#xff0c;RT-Thread 等&#xff0c;都是 RTOS 类操作系统。 FreeRTOS 由美国的 Richard Barry 于 2003 年发布。 FreeRTOS 于 2017 年被亚马逊收购&#x…

【EXCEL数据处理】000022 案例 保姆级教程,附多个操作案例。EXCEL邮件合并工具

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000022 案例 保姆级教程&#xff0c;附多个操作案例。…

如何基于 RLHF 来优化 ChatGPT 类型的大语言模型

&#x1f6b4;前言 对于ChatGPT来说&#xff0c;RLHF是其训练的核心。所谓RLHF&#xff0c;即Reinforcement Learning with Human Feedback&#xff0c;基于人类反馈的强化学习。这项技术通过结合模型自身的生成能力和人类专家的反馈&#xff0c;为改进文本生成质量提供了新的…

云计算Openstack Horizon

OpenStack是一个开源的云计算平台&#xff0c;提供了构建和管理云计算环境所需的软件工具。而Horizon则是OpenStack的一个关键组件&#xff0c;它是基于Web的用户界面&#xff0c;为用户提供了一种直观、便捷的方式来管理和使用OpenStack资源。 一、技术原理 Horizon是一个基…

CloudStack计算节点配置

主机信息 CloudStack计算节点 任务1、计算节点基础环境准备 1)需要创建2张网卡&#xff01;&#xff01;&#xff01;】 2)VMware Workstation 中设置网卡模式为NAT&#xff0c;在“网络编辑器”中设置DHCP&#xff0c;网关设置为192.168.100.1&#xff0c;地址段为192.168.…