【Spring事物三千问】Spring配置多数据源 vs 给多个数据源添加事物管理

news/2025/3/15 0:56:14/

在 Spring 中配置多数据源 与 给多个数据源添加事物管理是有区别的。
如果只需要使用到多个数据源,而不需要进行事物管理,是可以进行简单处理的。

Spring 中配置多数据源

如果不需要对数据源进行事物管理的话,在 Spring 中配置多个数据源是相对比较容易的。
根据前面分析 多事务管理器&多数据源的处理,我们知道,如果使用 MyBatis 来操作 DB 的话,那么配置多数据源只需要两步:
1、定义 n 个数据源 DataSource
2、定义基于 DataSource 的 SqlSessionFactory (通过 MyBatis 操作 sql)

多数据源的配置示例如下:

// Master 数据源配置
@Configuration
@MapperScan(basePackages = "com.kvn.mapper.master", sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterMybatisConfig {@Bean("master")@ConfigurationProperties(prefix = "spring.datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Bean("masterSqlSessionFactory")public SqlSessionFactory masterSqlSessionFactory(@Qualifier("master") DataSource dataSource) throws Exception {// 设置数据源MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();mybatisSqlSessionFactoryBean.setDataSource(dataSource);// mapper 的xml文件位置PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();String locationPattern = "classpath*:/mapper/master/*.xml";mybatisSqlSessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));// 对应数据库的 entity 位置String typeAliasesPackage = "com.kvn.entity.master";mybatisSqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);return mybatisSqlSessionFactoryBean.getObject();}
}------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------// Slave 数据源配置
@Configuration
@MapperScan(basePackages = "com.kvn.mapper.slave", sqlSessionFactoryRef = "masterSqlSessionFactory")
public class SlaveMybatisConfig {@Bean("slave")@ConfigurationProperties(prefix = "spring.datasource.slave")public DataSource slaveDataSource() {return DataSourceBuilder.create().build();}@Bean("slaveSqlSessionFactory")public SqlSessionFactory masterSqlSessionFactory(@Qualifier("slave") DataSource dataSource) throws Exception {// 设置数据源MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();mybatisSqlSessionFactoryBean.setDataSource(dataSource);// mapper 的xml文件位置PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();String locationPattern = "classpath*:/mapper/master/*.xml";mybatisSqlSessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));// 对应数据库的 entity 位置String typeAliasesPackage = "com.kvn.entity.slave";mybatisSqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);return mybatisSqlSessionFactoryBean.getObject();}}

Spring 中配置多数据源的事物管理

如果要给数据源添加添加事物管理的功能的话,那么就需要在多数据源配置的基础之上,再给每个 DataSource 添加事物管理器(TransactionManager),同时,开启对 @Transactional 方法的拦截。
所以,配置多数据源的事物管理的步骤如下:
1、定义 n 个数据源 DataSource
2、定义基于 DataSource 的 SqlSessionFactory (通过 MyBatis 操作 sql)
3、定义基于 DataSource 的 TransactionManager(事物管理器)
4、通过 @EnableTransactionManagement 来开启对 @Transactional 方法的拦截

多数据源的事物管理配置示例如下:

// Master 数据源配置
@Configuration
@MapperScan(basePackages = "com.kvn.mapper.master", sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterMybatisConfig {@Bean("master")@ConfigurationProperties(prefix = "spring.datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}/*** 创建 master 数据源的事物管理器*/@Bean(name = "masterTxManager")public PlatformTransactionManager masterTxManager(@Qualifier("master") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean("masterSqlSessionFactory")public SqlSessionFactory masterSqlSessionFactory(@Qualifier("master") DataSource dataSource) throws Exception {// 设置数据源MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();mybatisSqlSessionFactoryBean.setDataSource(dataSource);// mapper 的xml文件位置PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();String locationPattern = "classpath*:/mapper/master/*.xml";mybatisSqlSessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));// 对应数据库的 entity 位置String typeAliasesPackage = "com.kvn.entity.master";mybatisSqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);return mybatisSqlSessionFactoryBean.getObject();}
}------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------// Slave 数据源配置
@Configuration
@MapperScan(basePackages = "com.kvn.mapper.slave", sqlSessionFactoryRef = "masterSqlSessionFactory")
public class SlaveMybatisConfig {@Bean("slave")@ConfigurationProperties(prefix = "spring.datasource.slave")public DataSource slaveDataSource() {return DataSourceBuilder.create().build();}/*** 创建 slave 数据源的事物管理器*/@Bean(name = "slaveTxManager")public PlatformTransactionManager slaveTxManager(@Qualifier("slave") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean("slaveSqlSessionFactory")public SqlSessionFactory masterSqlSessionFactory(@Qualifier("slave") DataSource dataSource) throws Exception {// 设置数据源MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();mybatisSqlSessionFactoryBean.setDataSource(dataSource);// mapper 的xml文件位置PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();String locationPattern = "classpath*:/mapper/master/*.xml";mybatisSqlSessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));// 对应数据库的 entity 位置String typeAliasesPackage = "com.kvn.entity.slave";mybatisSqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);return mybatisSqlSessionFactoryBean.getObject();}
}

小结

抽象出来看的话,在 Spring 中配置多数据源,其实就是定义多个 DataSource 的 bean。
而配置多数据源的事物管理,就是在多个 DataSource bean 的基础之上,再为每个 DataSource 添加 TransactionManager 事物管理器。

附:
PlatformTransactionManager 是 Spring 事务实现的核心接口。它提供了三个方法用来管理事务:
1、 getTransaction(TransactionDefinition)
2、 commit(TransactionStatus)
3、 rollback(TransactionStatus)

PlatformTransactionManager 提供了管理事物的能力,而对 @Transactional 事物方法拦截的处理是通过 @EnableTransactionManagement 来开启的。
@EnableTransactionManagement 的作用是自动注册 BeanFactoryTransactionAttributeSourceAdvisor,让 TransactionInterceptor 来拦截 @Transactional 标记的方法。

所以,PlatformTransactionManager@EnableTransactionManagement 的共同作用下,让 Spring 拥有了对 @Transactional 标记的方法进行事物管理的能力。


http://www.ppmy.cn/news/33685.html

相关文章

指针:程序员的望远镜

指针:程序员的望远镜一、什么是指针1.1 指针的定义1.2 指针和普通变量的区别1.3 指针的作用1.4 指针的优点和缺点二、指针的基本操作2.1 取地址运算符"&"2.2 指针的声明与定义2.3 指针的初始化2.4 指针的解引用2.5 指针的赋值2.6 指针的运算2.7 指针的…

FreeRTOS-编程风格

数据类型 portCHAR -- char portSHORT -- short portLONG -- long portTickType : 用于定义系统时基计数器的值和阻塞时间 -- unsigned short int , 当 FreeRTOSConfig.h 宏 configUSE_16_BIT_TICKS 为 1 时为 16 位 -- unsigned int , 当 FreeRTOSConfig.h 宏…

curosr使用c++实现图片视频转字符画风格带gui

talk is cheap show you the code 99%的代码都是通过cursor写出来的,提示太长了会卡住,所以最好先列一个提纲,每个步骤一定要详细 比如 实现一个函数,输入图片路径,然后把图片转换成字符画,再把字符画保存…

MySQL相关面试题解析(一)

文章目录 1.有如下数据库表,其中两个事务按照如下顺序执行,回答下列问题?2.同样是上面的数据库表,如果修改事务如下,回答下列问题?3.同样是上面的数据库表,如果修改事务如下,回答下列问题?1.有如下数据库表,其中两个事务按照如下顺序执行,回答下列问题? create ta…

蓝桥杯刷题冲刺 | 倒计时21天

作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.迷宫1.迷宫 题目 链接: 迷宫 - 蓝桥云课 (lanqiao.cn) 本题为填空题,只…

Redis缓存雪崩、缓存击穿、缓存穿透

用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了。 当用户的请求,都访问数据库的话,请求数量一上来,数据库很容易就奔溃的了,所以为了避免用户直…

jsoup 框架的使用指南

概述 参考: 官方文档jsoup的使用JSoup教程jsoup 在 GitHub 的开源代码 概念简介 jsoup 是一款基于 Java 的 HTML 解析器,它提供了一套非常省力的 API,不但能直接解析某个 URL 地址、HTML 文本内容,而且还能通过类似于 DOM、CS…

浏览器的组成部分

什么是浏览器? Web 浏览器简称为浏览器,是一种用于访问互联网上信息的应用软件。浏览器的主要功能是从服务器检索 Web 资源并将其显示在 Web 浏览器窗口中。 Web 资源通常是 HTML 文档,但也可能是 PDF、图像、音频、视频或其他类型的内容。…