Spring多数据源管理方案

Spring多数据源管理方案

基于Spring的AbstractRoutingDataSource实现多数据源

数据库连接配置

spring:application:name: dynamic-sourcedatasource:datasource1:jdbc-url: jdbc:mysql://localhost:3306/cloud-demo?useUnicode=true&characterEncoding=utf-8&useSSL=falsedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: rootinitialSize: 1maxActive: 20minIdle: 1maxWait: 60000datasource2:jdbc-url: jdbc:mysql://localhost:3306/foodie_dev?useUnicode=true&characterEncoding=utf-8&useSSL=falsedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: rootinitialSize: 1maxActive: 20minIdle: 1maxWait: 60000

数据源配置

@Configuration
public class DataSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource1")public DataSource dataSource1() {// 根据配置 创建数据源实例return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource2")public DataSource dataSource2() {return DataSourceBuilder.create().build();}}

继承AbstractRoutingDataSource,实现数据源切换逻辑

@Component
@Primary
public class DynamicDataSource extends AbstractRoutingDataSource {public static ThreadLocal<String> dataSourceKey = new ThreadLocal<>();@Autowiredprivate DataSource dataSource1;@Autowiredprivate DataSource dataSource2;/*** 决定使用哪个数据源之前需要调用这个方法来设置*/@Overrideprotected Object determineCurrentLookupKey() {return dataSourceKey.get();}@Overridepublic void afterPropertiesSet() {HashMap<Object, Object> targetDataSource = new HashMap<>();targetDataSource.put("W", dataSource1);targetDataSource.put("R", dataSource2);//设置数据源super.setTargetDataSources(targetDataSource);//设置默认数据源super.setDefaultTargetDataSource(dataSource1);super.afterPropertiesSet();}
}

在进行数据库操作时,切换到指定的数据源

@RestController
@RequestMapping("/test")
public class TestController {@Autowiredprivate AccountMapper accountManager;@RequestMapping("/account")public String selectAccount() {//查询clouded-demo数据库的account表DynamicDataSource.dataSourceKey.set("W");Account account = accountManager.selectByPrimaryKey(1);return account.toString();}@Autowiredprivate BookMapper bookMapper;@RequestMapping("/book")public String selectBook() {//查询foodie_dev数据库的book表DynamicDataSource.dataSourceKey.set("R");Book book = bookMapper.selectByPrimaryKey(1);return book.toString();}}

基于Mybatis实现多数据源

基于Mybatis实现多数据源管理,需要自己给每个数据源分别注册DataSource、SqlSessionFactory、
ataSourceTransactionManager

注册数据源1

@Configuration
@MapperScan(basePackages = "com.example.common.dao.w", sqlSessionFactoryRef = "wSqlSessionFactory")
public class WDataSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource1")public DataSource wDataSource() {return DataSourceBuilder.create().build();}@Bean@Primarypublic SqlSessionFactory wSqlSessionFactory(@Qualifier ("wDataSource") DataSource wDataSource) throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();//指定这个数据源要使用的mapper文件的位置sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/w/*.xml"));sqlSessionFactoryBean.setDataSource(wDataSource);return sqlSessionFactoryBean.getObject();}@Beanpublic DataSourceTransactionManager wDataSourceTransactionManager(@Qualifier ("wDataSource") DataSource wDataSource) {DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(wDataSource);return transactionManager;}}

注册数据源2

@Configuration
@MapperScan(basePackages = "com.example.common.dao.r", sqlSessionFactoryRef = "rSqlSessionFactory")
public class RDataSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource2")public DataSource rDataSource() {return DataSourceBuilder.create().build();}@Beanpublic SqlSessionFactory rSqlSessionFactory(@Qualifier("rDataSource") DataSource rDataSource) throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/r/*.xml"));sqlSessionFactoryBean.setDataSource(rDataSource);return sqlSessionFactoryBean.getObject();}@Beanpublic DataSourceTransactionManager rDataSourceTransactionManager(@Qualifier("rDataSource") DataSource rDataSource) {DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(rDataSource);return transactionManager;}}

基于Mybatis实现的多数据源管理不需要在进行数据库操作时切换数据源,因为已经给不同的数据源维护了不同的SqlSessionFactory等组件。

使用dynamic-datasource框架

多数据源下的事务处理

在多数据源下,事务的处理成为了一个问题。因为可能需要对不同的库进行操作,那么这个时候就需要考虑事务问题了。如果一个业务中对两个库进行了操作,那么对这两个库的操作必须要同时失败或者同时成功。

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

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

相关文章

【Python高级编程】图表类型指南:何时使用折线图、散点图、柱状图和饼状图

图表类型指南&#xff1a;何时使用折线图、散点图、柱状图和饼状图 在数据可视化中&#xff0c;选择合适的图表类型对于有效传达信息至关重要。以下是四种最常见的图表类型及其用途&#xff1a; 折线图 折线图用于显示数据随时间或其他连续变量的变化趋势。它们对于识别趋势…

MyBatis操作数据库(一)

什么是MyBatis? MyBatis是一个优秀的持久层框架&#xff0c;⽤于简化JDBC的开发。 MyBatis本是Apache的⼀个开源项⽬iBatis&#xff0c;2010年这个项目由apache迁移到了googlecode&#xff0c;并且改名为MyBatis。 简单来说MyBatis是更加简单完成数据和数据库交互的框架 什么…

前端根据权限生成三级路由

三级菜单和后端返回数组对比获取有权限的路由 数组&#xff1a; //后端返回的数组 const arr1 [sale.management, sale.order, sale.detail]; //前端路由 const arr2 [{path: "/sale-manage",redirect: "/sale-manage/sale-order/sale-list",name: sale…

CentOS下的miniconda3安装

软件下载与安装 下载 [pythoningdev ~]$ wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-x86_64.sh -O /tmp/Miniconda3-py38_4.12.0-Linux-x86_64.sh --2022-08-29 10:31:06-- https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux…

2-6 基于matlab2018B的语音信号降噪和盲源分离GUI界面

基于matlab2018B的语音信号降噪和盲源分离GUI界面&#xff0c;包括维纳滤波&#xff0c;小波降噪、高通、低通、带通滤波&#xff0c;及提出的滤波方法。每个功能均展示降噪前后声音效果并外放出来。程序已调通&#xff0c;可直接运行。 2-6 语音信号降噪 盲源分离 GUI界面 - 小…

Java Mybatis plus 语法中 避免sql循环

1. 查出全部数据并进行数据筛选过滤 在一对多的情况时&#xff0c;我们想把多的对象集合set进一的里面&#xff0c;需要避免循环sql Overridepublic R<List<ExRecord>> getExRecordAll(ExRecord exRecord) {// 获取用户idInteger userId Math.toIntExact(Securit…

从位运算看海象运算符

文章目录 前言需求先找出需要多少位数使用限制赋值场景判断场景 转为one-hot编码一件小事情 前言 突然发现了Python3.8版本引入的海象运算符&#xff0c;就借着位运算的需求来看看是怎么个用法。 需求 需求是这样的&#xff0c;我有一张表&#xff0c;表中存在很多类东西&…

canvas学习

Canvas API 提供了一个通过 JavaScript 和 HTML 的 元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。 Canvas 的基本用法 <canvas> 元素 <canvas id"tutorial" width"150" height"150&quo…

3.1. 马氏链-马氏链的定义和示例

马氏链的定义和示例 马氏链的定义和示例1. 马氏链的定义2. 马氏链的示例2.1. 随机游走2.2. 分支过程2.3. Ehrenfest chain2.4. 遗传模型2.5. M/G/1 队列马氏链的定义和示例 1. 马氏链的定义 对于可数状态空间的马氏链, 马氏性指的是给定当前状态, 其他过去的状态与未来的预测…

DM存储ontap系统修改管理IP

存储已配置完成在使用&#xff0c;修改管理ip不会影响生产 旧管理IP新管理IP192.0.2.1/24192.0.10.1/24192.0.2.2/24192.0.10.2/24192.0.2.3/24192.0.10.3/24 旧网关&#xff1a;192.0.2.254 新网关&#xff1a;192.0.10.254 查看现有的管理IP信息 cluster1::> network …

[Python]Anaconda相关命令

环境操作相关命令 查看所有环境 conda env list创建环境 conda create --name cahttts python3.10激活环境 conda activate cahttts安装依赖文件 pip install -r requirements.txt查看GPU型号 nvidia-smi -LGPU 0: NVIDIA A10 (UUID: GPU-9f1fc9cf-582a-25ac-849c-2f77343…

TS-语法介绍

1. 基本语法 变量声明 TypeScript 中的变量声明方式有 let、const 和 var&#xff0c;推荐使用 let 和 const。 let isDone: boolean false; const PI: number 3.14;函数 函数声明与 JavaScript 类似&#xff0c;但可以指定参数和返回值类型。 function add(x: number, …

ESD与EOS区别

最近小白在做项目时&#xff0c;被一个实习生问道了&#xff0c;关于EOS与ESD区别。说实话&#xff0c;以前专注于测试debug的我&#xff0c;在回答对方时&#xff0c;并没法做到太全面的解答。于是乎&#xff0c;借助周内的空闲时间&#xff0c;小白还是简单学习总结了一番。 …

洛谷 AT_arc168_a [ARC168A] <Inversion> 题解

逆序对 在一个没有重复数值的序列 a a a 之中&#xff0c;如果存在一组下标 i i i 和 j j j 使得 i < j i<j i<j&#xff0c;那么当 a i > a j a_i>a_j ai​>aj​ 时&#xff0c;就称 a i a_i ai​ 和 a j a_j aj​ 是序列 a a a 中的一组逆序对。 …

Harbor镜像中心搭建

文章目录 Harbor镜像中心搭建前置条件下载Harbor创建CA证书配置Harbor开始启动地址映射访问配置本地登录配置外部虚拟机访问 Harbor镜像中心搭建 Harbor是一个镜像中心&#xff0c;我们所熟知的DockerHub就是一个镜像中心&#xff0c;我们可以把我们打包的镜像放在镜像中心中供…

JavaFX应用

JavaFX案例&#xff1a;集成进度条与后台任务 在这个示例中&#xff0c;我们将向JavaFX应用中集成一个进度条&#xff0c;用来展示一个模拟的后台任务的完成进度。这将涉及JavaFX的并发特性&#xff0c;特别是Task类和如何在UI线程安全地更新UI组件。 假设我们想要实现一个简…

关于Java

关于Java Java语言关于并发JVM调优工具写在最后 Java语言 Java语言作为当下主流开发语言&#xff0c;其面向对象的开发模式以及一次编译多次运行&#xff0c;跨平台运行以及自动的垃圾回收机制可以说是给开发者节省了很大的时间用于逻辑功能的开发&#xff0c;那么在开发过程中…

【Linux】pycharmgit相关操作

目录 1. git安装配置2. 相关内容3. pycharm连接远程仓库3.1 配置3.2 clone远程仓库3.3 本地仓库上传远程 4. 分支管理4.1 更新代码4.2 新建分支4.3 分支合并4.4 代码比对 5. 版本管理6. 命令行操作6.1 配置git6.2 基础操作6.3 分支操作 1. git安装配置 下载链接&#xff1a;官…

07--Zabbix监控告警

前言&#xff1a;和普米一样运维必会的技能&#xff0c;这里总结一下&#xff0c;适用范围非常广泛&#xff0c;有图形化界面&#xff0c;能帮助运维极快确定问题所在&#xff0c;这里记录下概念和基础操作。 1、zabbix简介 Zabbix是一个基于 Web 界面的企业级开源解决方案&a…

【C++】C++入门的杂碎知识点

思维导图大纲&#xff1a; namespac命名空间 什么是namespace命名空间namespace命名空间有什么用 什么是命名空间 namespace命名空间是一种域&#xff0c;它可以将内部的成员隔绝起来。举个例子&#xff0c;我们都知道有全局变量和局部变量&#xff0c;全局变量存在于全局域…