springboot+JTA简单实现多数据源事务

Springboot + JTA 简单实现多数据源事务

JTA

JTA,即Java Transaction API,JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。

依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jta-atomikos</artifactId>
        </dependency>

YML配置

spring:  
  jta:
    atomikos:
      datasource:
        primary:
          xa-properties:
            url: jdbc:mysql://host:3306/test-source?useUnicode=true&characterEncoding=utf-8
            user: ENC(leNmW2mZWHadQdE9aq5iIw==)
            password: ENC(k5SFNga7adQ/xFsxzbe3Rbe3pZEow0KdSj0pWlDjDJA=)
          xa-data-source-class-name: com.mysql.cj.jdbc.MysqlXADataSource
          unique-resource-name: coolSource
          max-pool-size: 25
          min-pool-size: 3
          max-lifetime: 20000
          borrow-connection-timeout: 10000
        secondary:
          xa-properties:
            url: jdbc:mysql://host:3306/test-user?useUnicode=true&characterEncoding=utf-8
            user: ENC(leNmW2mZWHadQdE9aq5iIw==)
            password: ENC(k5SFNga7adQ/xFsxzbe3Rbe3pZEow0KdSj0pWlDjDJA=)
          xa-data-source-class-name: com.mysql.cj.jdbc.MysqlXADataSource
          unique-resource-name: coolUser
          max-pool-size: 25
          min-pool-size: 3
          max-lifetime: 20000
          borrow-connection-timeout: 10000

DataSourceConfig+Mybatis 分包配置

db1
@Configuration
@MapperScan(basePackages = "com.lcx.more.mapper.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DB1Config {

    @Bean("coolSourceDataSource")
    @ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.primary")
    public DataSource primaryDataSource() {
        return new AtomikosDataSourceBean();
    }

    @Bean(name = "db1SqlSessionFactory")
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("coolSourceDataSource") DataSource coolSourceDataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean ();
        sessionFactory.setDataSource(coolSourceDataSource);
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true);//驼峰
        sessionFactory.setConfiguration(configuration);
        sessionFactory.setTypeAliasesPackage("com.lcx.more.entity.db1");
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/db1/*.xml"));
        return sessionFactory.getObject();
    }

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

}
db2
@Configuration
@MapperScan(basePackages = "com.lcx.more.mapper.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")
public class DB2Config {

    @Bean("coolUserDataSource")
    @ConfigurationProperties(prefix = "spring.jta.atomikos.datasource.secondary")
    public DataSource secondaryDataSource() {
        return new AtomikosDataSourceBean();
    }

    @Bean(name = "db2SqlSessionFactory")
    public SqlSessionFactory db2SqlSessionFactory(@Qualifier("coolUserDataSource") DataSource coolUserDataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean ();
        sessionFactory.setDataSource(coolUserDataSource);
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true);//驼峰
        sessionFactory.setConfiguration(configuration);
        sessionFactory.setTypeAliasesPackage("com.lcx.more.entity.db2");
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/db2/*.xml"));
        return sessionFactory.getObject();
    }

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

测试

   @Transactional(rollbackFor = Exception.class)
    public void jtaTest() {
        // DB1
        TxJTATest txJTATest = new TxJTATest();
        txJTATest.setName("test2");
        txJTATestMapper.insert(txJTATest);
        // DB2 tb1
        TestTxA testTxA = new TestTxA();
        testTxA.setTestName("txa2");
        testTxAMapper.insert(testTxA);
        // DB2 tb2
        TestTxB testTxB = new TestTxB();
        testTxB.setTestCode("txb2");
        testTxBMapper.insert(testTxB);

        throw new RuntimeException("报错啦...");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值