springboot之多数据源---1
创始人
2024-04-26 00:16:17
0

一、多数据源的典型使用场景
在实际开发中,经常可能遇到在一个应用中可能需要访问多个数据库的情况。以下是两种典型场景:
1 业务复杂(数据量大)
数据分布在不同的数据库中,数据库拆了, 应用没拆。 一个公司多个子项目,各用各的数据库,涉及数据共享…
2 读写分离
为了解决数据库的读性能瓶颈(读比写性能更高, 写锁会影响读阻塞,从而影响读的性能)。
很多数据库拥主从架构。也就是,一台主数据库服务器,是对外提供增删改业务的生产服务器;另一(多)台从数据库服务器,主要进行读的操作。ꞏ
可以通过中间件(ShardingSphere、mycat、mysql-proxy 、TDDL …), 但是有一些规模较小的公司,没有专门的中间件团队搭建读写分离基础设施,因此需要业务开发人员自行实现读写分离。
二、 如何实现多数据源

在这里插入图片描述
1.当执行数据库持久化操作,只要集成了Spring就一定会通DataSourceUtils获取Connection。
2. 通过Spring注入的DataSource获取Connection 即可执行数据库操作
所以思路就是:只需配置一个实现了DataSource的Bean, 然后根据业务动态提供Connection即可。
3.其实Spring已经提供一个DataSource实现类用于动态切换数据源——AbstractRoutingDataSource。
4.分析AbstractRoutingDataSource即可实现动态数据源切换。
5.so! 我们只需创建AbstractRoutingDataSource实现类DynamicDataSource然后 始化targetDataSources和key为数据源标识(可以是字符串、枚举、都行,因为标识是Object)、defaultTargetDataSource即可。
6.后续当调用AbstractRoutingDataSource.getConnection 会接着调用提供的模板方法:determineTargetDataSource。
7.通过determineTargetDataSource该方法返回的数据库标识 ,从resolvedDataSources 中拿到对应的数据源。
8.so!我们只需DynamicDataSource中实现determineTargetDataSource为其提供一个数据库标识。

总结: 在整个代码中我们只需做4件大事:

  1. 定义AbstractRoutingDataSource实现类DynamicDataSource
  2. 初始化时为targetDataSources设置 不同数据源的DataSource和标识、及defaultTargetDataSource
  3. 在determineTargetDataSource中提供对应的数据源标识即可
    4、切换数据源识即

1. 配置多数据源 和 AbstractRoingDataSource的自定义实现类:DynamicDataSource
配置多数据
在这里插入图片描述
DataSourceConfig
-
在这里插入图片描述

DynamicDataSource 代码:
在这里插入图片描述
在这里插入图片描述
2.2、多数据源切换方式
切换方式看你具体需求:
2.2.1、AOP+自定义注解
不同业务的数据源: 一般利用AOP,结合自定义注解动态切换数据源:
1.自定义注解

在这里插入图片描述
2.切面类
在这里插入图片描述
3.使用注解

在这里插入图片描述
2.2.2、MyBatis插件
读写分离的数据源:如果是MyBatis可以结合插件实现读写分离动态切换数据源。
在这里插入图片描述
在这里插入图片描述
2.3、Spring集成多个MyBatis框架 实现多数据源

在这里插入图片描述
WDataSourceConfig
在这里插入图片描述
RDataSourceConfig
在这里插入图片描述

相关内容

热门资讯

安卓更换别的手机系统,轻松切换... 你有没有想过,你的安卓手机用久了,是不是有点审美疲劳了呢?或者,你最近是不是对其他手机系统产生了浓厚...
安卓系统单机神雕侠侣,指尖重温 你有没有想过,在手机上也能体验一把江湖恩怨、侠骨柔肠?没错,就是那个让人心驰神往的《神雕侠侣》!今天...
安卓系统键盘语言切换,安卓系统... 你有没有发现,手机上的安卓系统键盘语言切换功能,简直就像是个神奇的魔法棒,轻轻一点,就能让文字飞舞在...
oppok1安卓系统,性能与体... 你有没有发现,最近手机圈里又掀起了一股热潮?没错,就是OPPO K1这款新机!这款手机不仅外观时尚,...
安卓系统环境的搭建,从零开始构... 想要在电脑上体验安卓系统的魅力,是不是已经跃跃欲试了呢?别急,今天就来手把手教你如何搭建一个属于自己...
【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...