SpringBoot多数据源保证事务性

413 阅读1分钟

多数据源配置

application.yml配置文件:

spring:
  datasource:
    one:
      jdbc-url: jdbc:sqlserver://localhost:1433;DatabaseName=db
      username: root
      password: root
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

    two: # 数据源2
      jdbc-url: jdbc:sqlserver://localhost:1433;DatabaseName=db2
      username: root
      password: root
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

    three:
      jdbc-url: jdbc:sqlserver://localhost:1433;DatabaseName=db3
      username: root
      password: root
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

创建数据源配置类

image.png

image.png

OneDataSourceConfig类


/**
 * @author miracle
 */
@Configuration
@MapperScan(basePackages = {"org.peak.miracle.db.dao"},
        sqlSessionTemplateRef = "oneSqlSessionTemplate")
public class OneDataSourceConfig {

    @Bean(name = "oneDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.one")
    @Primary
    public DataSource oneDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "oneSqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);

   
        bean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:org/peak/miracle/db/dao/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "oneTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("oneDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "oneSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("oneSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

TwoDataSourceConfig类

/**
 * @author miracle
 */
@Configuration
@MapperScan(basePackages = {"com.miracle.equipment.mapper.two"}, sqlSessionTemplateRef = "twoSqlSessionTemplate")
public class TwoDataSourceConfig {

    @Bean(name = "twoDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.two")
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "twoSqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("twoDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean ();
        bean.setDataSource(dataSource);
        bean.setPlugins(new Interceptor[]{new PaginationInterceptor()});
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/two/*.xml"));

        return bean.getObject();
    }

    @Bean(name = "twoTransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("twoDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "twoSqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("twoSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
}

多个数据则对应创建配置类

业务实现层

transactionManager = "oneTransactionManager" 多数据源时需要指定事务管理器的bean的名字 注入事务管理器的bean时,默认是根据类型去注入,如果该类型有多个Bean,不通过bean的名字去注入,默认是会注入被@Primary标识的bean的.

@Service
public class workServiceImpl extends ServiceImpl<workMapper, work> implements IWorkService {

  @Override
  @Transactional(rollbackFor = Exception.class, transactionManager =    "oneTransactionManager")
  public void updateWork() {
       ...
  }

}

注意:当没有使用@Primary,且@Transactional注解中没有使用transactionManager注明使用的事务管理器则该方法的事务会失效。