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和客…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...