Spring事物三千问Spring配置多数据源 vs 给多个数据源添加事物管理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事物三千问Spring配置多数据源 vs 给多个数据源添加事物管理相关的知识,希望对你有一定的参考价值。
在 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
事物管理器。
以上是关于Spring事物三千问Spring配置多数据源 vs 给多个数据源添加事物管理的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点#Spring源码三千问Spring AOP 中 TargetSource 的作用及原理分析
Spring源码三千问从源码分析@Resource与@Autowired的区别
#yyds干货盘点# Spring源码三千问AdviceAdvisorAdvised都是什么接口?
#yyds干货盘点# Spring源码三千问Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?