SpringBoot配置多数据源和事务管理

时间:2025-03-28 18:52:20

配置第一个数据源

@Configuration
public class RTxManager {

    public RTxManager() {
    }

    @Bean(
        name = {"RDBSource"}
    )
    @ConfigurationProperties(
        prefix = ""
    )
    @Primary
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(
        name = {"RDBTransMg"}
    )
    @Primary
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(this.dataSource());
    }

    @Bean(
        name = {"sqlSessionFactory"}
    )
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("RDBSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        return sessionFactory.getObject();
    }
}

配置第二个数据源

@Configuration
@EnableTransactionManagement
@EnableAspectJAutoProxy(exposeProxy = true)
@MapperScan(basePackages = "", sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig{

	// 配置第二个数据源
    @Bean(name = "secondDataSource")
    @ConfigurationProperties(prefix = "")
    public DataSource secondDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/second/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "secondSqlSessionTemplate")
    public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }


}

配置默认数据源事务管理

配置第一个数据源为默认数据源事务

@Configuration
public class DigitalOpsStartup implements TransactionManagementConfigurer {
	@Autowired
    private RTxManager dataSource;

	    // 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return dataSource.txManager();
    }
}

多数据源需要在声明事务时指定当前数据源的事务管理@Transactional(value = “secondTransactionManager”),当前数据源事务才会生效,也可以更改默认事务管理为当前数据源