spring-boot入门(七)atomikos+druid+多数据源下的分布式事务配置
本章内容是基于spring-boot入门(六)多数据源的基础之上进行的,如果还不了解多数据源怎么配置,请参考上一章节的内容。在上一章节的末尾我们遗留了一个问题:多数据源下的分布式事务问题。在分布式事务下我们需要使用JTA(Java Transaction API)事务来处理事务,保证事务的强一致性,即要成功都成功,一个失败全部回滚。Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器,本章我们将使用Atomikos 来解决分布式事务问题。
1. 配置atomikos
JTA事务的配置需要配置:XA数据源和JTA事务管理器
1.1 引入atomikos依赖
spring boot集成atomikos,只需添加一下依赖即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
1.2 自定义atomikos相关属性(自动注入JTA事务管理器)
如果不自定义相关属性,那么spring boot 会初始化默认的atomikos配置,可看org.springframework.boot.autoconfigure.transaction.jta.AtomikosJtaConfiguration是如何初始化默认的配置。当然也可以自定义atomikos,通过该配置spring boot会启用atomikos实现的JTA事务管理器。
spring:
jta:
atomikos:
properties:
max-actives: 50
max-timeout: 300000
default-jta-timeout: 10000
enable-logging: true
上面是atomikos的一个配置示例。更多可查看org.springframework.boot.jta.atomikos.AtomikosProperties。
1.3 配置XA数据源
@Bean
@Primary
@ConfigurationProperties(prefix = "boc.datasource")
public DataSource bocDataSource(@Qualifier("bocDataSourceProperties") DataSourceProperties dataSourceProperties) throws SQLException {
DruidXADataSource druidXADataSource = new DruidXADataSource();
InitDruidDataSource(druidXADataSource, dataSourceProperties);
AtomikosDataSourceBean atomikosDataSource = new AtomikosDataSourceBean();
atomikosDataSource.setUniqueResourceName("bocDataSource");
atomikosDataSource.setXaDataSource(druidXADataSource);
atomikosDataSource.setTestQuery("SELECT 1");
return atomikosDataSource;
}
@Bean
@Conf