springboot之多数据源配置
文章目录
- 一、多数据源的典型使用场景
- 1 业务复杂(数据量大)
- 2 读写分离
- 二、如何实现多数据源
- 通过AbstractRoutingDataSource动态指定数据源
- 多数据源切换方式
- AOP
- MyBatis插件
- 三、spring集成多个Mybatis框架 实现多数据源控制
- 四、dynamic-datasource 多数据源组件
一、多数据源的典型使用场景
实际开发中,进场可能遇到在一个引用中可能需要访问多个数据库的情况,以下是两种典型场景:
1 业务复杂(数据量大)
数据分布在不同的数据库汇总,数据库拆了,应用没拆。一个公司多个子项目,各用各的数据库,涉及数据共享。。。。

2 读写分离
为了解决数据库的读性能瓶颈(读比写性能更高,写锁会影响读阻塞,从而影响读的性能)。
很多数据拥主从架构。也就是,一台主数据库服务器,对外提供增删改查的生产服务器;另一台从数据库服务器,主要进行读的操作。
可以通过中间件(ShardingSphere、mycat、mysql-proxy 、TDDL 。。。。) 但是有一些规模较小的公司,没有专门的中间件团队搭建读写分离基础设施,因此需要业务开发人员自行实现读写分离。

这里的框架与上图类似。 不同的是,在读写分离中,主库和从库的数据库是一致的(不考虑主从延迟)。数据更新操作(insert 、update、delete)都是在主库上进行的,主库将数据更新信息同步给
从库。在查询时,可以在从库上进行。从而分担主库的压力。
二、如何实现多数据源
对于大多数的java应用,都是用了spring框架,spring-jdbc模块提供AbstractRoutingDataSource,其内部可以包含了多个DataSource, 然后在 运行时来动态的访问哪个数据库。这种方式访问数据的框架图如下所示:

应用直接操作的 AbstractRoutingDataSource的实现类,告诉AbstractRoutingDataSource访问哪个数据库,然后由AbstractRoutingDataSource从事先配置好的数据源(db1,db2) 选择一个,来访问对应的数据库。
通过AbstractRoutingDataSource动态指定数据源
多数据源切换方式

应用直接操作的是abstractRoutingDataSource的实现类,告诉AbstractRoutingDataSource访问哪个数据库,然后由AbstractRoutingDataSource从事先配置好的数据源 (ds1,ds2)选择哪一个 ,来访问对应的数据库。

AOP
@Component
@Aspect
public class DynamicDataSourceAspect {//前置@Before(value ="within(com.example.dynamic.datasource.service.impl.*) && @annotation(wr)")public void before( WR wr){String value = wr.value();RoutingDataSourceContext order = new RoutingDataSourceContext(value);System.out.println("数据源===="+value);}
}@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface WR {String value() default "query";
}
@RestController
@RequestMapping("frend")
@Slf4jpublic class FrendController {@WR@GetMapping("query")public List<menu> query(){List<menu> list = menuService.list();return list;}}
MyBatis插件
- 读写分离的数据源:如果是Mybaits 可以结合插件实现读写分离动态切换数据源
package com.example.dynamic.datasource.plugin;import com.alibaba.druid.sql.ast.statement.SQLCommentStatement;
import com.example.dynamic.datasource.config.DynamicDataSource;
import com.example.dynamic.datasource.config.RoutingDataSourceContext;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;import java.util.Properties;/*** @ClassName:DynamicDataSourcePlugin* @Description:* @Author:* @Date:8/20/23 10:21 下午* @Versiion:1.0*/
//1.如下配置
//2. 将文件加入到mybatis中去
//Intercepts 声明mybatis 固定的写法
//Signature 代表为mybatis 底层的哪个对象,去进行插件代理
@Intercepts({@Signature(type = Executor.class,method = "update",args = {MappedStatement.class,Object.class}),
@Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class,ResultHandler.class})})
public class DynamicDataSourcePlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {//拿到当前方法【update、query】的所有参数Object[] objects =invocation.getArgs();//MappedStatement 封装sqlMappedStatement ms = (MappedStatement) objects[0];//if(ms.getSqlCommandType().equals(SqlCommandType.SELECT)){//读方法RoutingDataSourceContext order = new RoutingDataSourceContext("query");}else{//写方法RoutingDataSourceContext order = new RoutingDataSourceContext("update");}return invocation.proceed();}@Overridepublic Object plugin(Object target){if(target instanceof Executor){return Plugin.wrap(target,this);}else{return target;}}@Overridepublic void setProperties(Properties properties) {}
}
三、spring集成多个Mybatis框架 实现多数据源控制

四、dynamic-datasource 多数据源组件
相关文章:
springboot之多数据源配置
文章目录 一、多数据源的典型使用场景1 业务复杂(数据量大)2 读写分离 二、如何实现多数据源通过AbstractRoutingDataSource动态指定数据源多数据源切换方式AOPMyBatis插件 三、spring集成多个Mybatis框架 实现多数据源控制四、dynamic-datasource 多数据…...
无涯教程-PHP - 静态变量函数
静态变量 静态变量在函数退出时值不会丢失,您只需将关键字STATIC放在变量名称的前面,即可将变量声明为静态变量。 <?phpfunction keep_track() {STATIC $count0;$count;print $count;print "<br />";}keep_track();keep_track();keep_track(); ?> 这…...
2023-08-20力扣今日二题
链接: 1312. 让字符串成为回文串的最少插入次数 题意: 如题 解: 动态规划,枚举回文串中点并递增回文串长度 初始状态若LR则单个字符为中点,需要添加0个字符成为回文串;若L1R则如果S[L]S[R]则需要添加…...
【地理专题】2023年最新全国A级景区数
数据来源:中国文化和旅游部时间跨度:2023年区域范围:全国范围数据字段: 景区名称;地址;等级;城市;经度;纬度 该图基于自然资源部地图技术审查中心标准地图服务网站下载…...
Elasticsearch实战(一):Springboot实现Elasticsearch统一检索功能
文章目录 系列文章索引一、准备工作1、搭建docker环境2、安装eskibana3、es安装ik分词器(1)下载安装(2)测试 4、Springboot(1)引包(2)客户端公共方法(3)公共实…...
更改计算机睡眠时间
控制面板–>系统和安全–>电源选项下的更改计算机睡眠时间 如果关闭显示器时间小于使计算机进入睡眠状态时间,时间先到达关闭显示器时间,显示器关闭,这时电脑还在正常工作状态。如果此时敲击键盘显示器出现画面,无需输入密…...
Matplotlib数据可视化(一)
目录 1.Matplotlib简介 2.Matplotlib绘图基础 2.1 创建画布与子图 2.2 添加画布属性 2.3 绘图的保存与显示 1.Matplotlib简介 Matplotlib是一个用于绘制数据可视化图表的Python库。它提供了广泛的功能和灵活性,可以创建各种类型的图表,包括折线图、…...
LLM提示词工程和提示词工程师Prompting and prompt engineering
你输入模型的文本被称为提示,生成文本的行为被称为推断,输出文本被称为完成。用于提示的文本或可用的内存的全部量被称为上下文窗口。尽管这里的示例显示模型表现良好,但你经常会遇到模型在第一次尝试时无法产生你想要的结果的情况。你可能需…...
Python开发环境(Visual Studio Code、Anaconda、PyInstaller、Enigma Virtual Box)
Python开发环境 [Anaconda、PyInstaller、Enigma Virtual Box] AnacondaAnaconda安装搭建Python环境Anaconda命令 Visual Studio CodeVisual Studio Code中Python设置Visual Studio Code中使用Qt Designer Python打包发布.exe可执行文件PyinstallerEnigma Virtual Box Anaconda…...
Unreal Engine 测试总结
Android 项目打包应选择哪种纹理格式?打包模式区别? 根据官网文档介绍,建议使用 ETC2:所有OpenGL 3.x 类型的设备都支持,并且支持alpha压缩 打包模式包括:内部测试阶段的开发模式,对外发布的发行…...
Air780EG —— 合宙4G定位解决方案
定位模式: 外部单片机控制模式(常见于AT固件客户): 开机 -> 搜星 -> 定位成功 -> 上报 -> 关机 780E自行控制模式(常见于二次开发客户,AT用户也可以使用): 开机 -> 搜星 -> 定位成功 -> 模块休眠,关闭GP…...
【算法刷题之数组篇(2)】
目录 1.leetcode-35. 搜索插入位置(简单)2.leetcode-74. 搜索二维矩阵(中等)3.leetcode-73. 矩阵置零(中等)4.leetcode-56. 合并区间(中等)5.leetcode-54. 螺旋矩阵(中等…...
chromedriver.exe 的所有版本下载地址
Chrome for Testing availability 上面的网址是V115 v116.... 以上的。 CNPM Binaries Mirror 上面这个是V115版本以下的。 这个文章没有任何实际价值,记录的原因是因为突然发现过去的py无法运行,原因是chrome浏览器偷偷升级到V115,于是找…...
C++ 网络编程项目fastDFS分布式文件系统(四)-fastCGI项目相关技术以及linux搜狗输入法相关问题。
目录 1. Nginx作为web服务器处理请求 2. http协议复习 Get方式提交数据 Post方式提交数据 3. fastCGI 3.1 CGI 3.2 fastCGI 3.3 fastCGI和spawn-fcgi安装 1. 安装fastCGI 2. 安装spawn-fcgi 3.4 nginx && fastcgi 4其他知识点 1. fastCGI环境变量 - fas…...
【HarmonyOS】服务卡片 API6 JSUI跳转不同页面
【引言】 “JS卡片支持为组件设置action,包括router事件和message事件,其中router事件用于应用跳。若设置router事件,则action属性值为"router";abilityName为卡片提供方应用的跳转目标Ability名;params中的…...
【linux】debian10安装vim
debian10.0上用apt vim安装vim提示依赖的版本冲突。后来发现是软件源没有添加更新源buster-updates。 以下是问答。 问:debian10怎么安装vim? 答: 在 Debian 10 系统上安装 Vim 的方法很简单,主要有以下两种: 1. 使用 apt 命令安装 bash sudo apt u…...
文件同步工具rsync
文章目录 作用特性安装命令服务端启动增加安全认证及免密登录 实时推送源服务器配置结合inotify实现实时推送 参数详解 学些过程中遇到的问题 作用 rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或…...
【嵌入式开发 Linux 常用命令系列 12 -- linux 下 log 输出重定向 详细介绍 】
文章目录 Linux 输出重定向使用背景Linux 重定向使用介绍 上篇文章:嵌入式开发 Linux 常用命令系列 11 – linux 下 任务与CPU绑定命令 taskset 详细介绍 Linux 输出重定向使用背景 在Linux中,输入和输出重定向是非常常见的操作,它们可以用…...
gin中关于参数注入问题
关于参数注入的问题 如果在开发中一旦发小参数没有按照既定的要求注入到结构体的话,这个时候就一定要看请求方式什么?如果是post请求、 前端—post—json{id:1,pageSize:10,page:1}———————————- 参数注入方法:ShouldBindJSON p…...
记录首次面试2023-08-18
人生第一次面试,大概一个小时左右。没有问我C的,上来一个数据库事务,虽然没有复习,但是还是能够记住一些,主要问的一些事务的隔离级别,以及都有什么作用,我是举例回答的,客户端A和客…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
