SpringBoot 多数据源解决分布式事务主要通过jta + atomikos来生成全局事物管理器,来管理每一个datasource的数据源。
话不多说,直接看操作:
(1)引入jta + atomikos相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
(2)建立一个java类,读取yml配置文件的datasource文件
package com.gh.user;
@ConfiguationProperties(prefix = "spring.datasource.user")
@Data //需引入lombok
public class UserConfig{
private String url;
private String username;
private String password;
}
(3) 创建数据源管理
package com.mybatis;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.mysql.cj.jdbc.MysqlXADataSource;
@Configuration
@MapperScan(basePackages="com.gh.user.mapper",sqlSessionTemplateRef="userSqlSessionTemplate")
public class UserDatasourceConfig {
/**
* 单一数据源
* @return
*/
@Bean("userDataSource")
@ConfigurationProperties(prefix = "spring.datasource.user") //多数据源整合时用到
public DataSource userDataSource(){
return DataSourceBuilder.create().build();
}
/**
* 创建datasource 将数据源统一交给全局xa事务管理
* @return
*/
@Bean("userDataSource")
public DataSource userDataSource(UserConfig userConfig){
//下面的参数都是从userconfig中获取
//1、创建xa datasource
MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
mysqlXADataSource.setUrl(url);
mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);;
mysqlXADataSource.setPassword(pass);
mysqlXADataSource.setUser(userID);
//2、注册到全局事务上
AtomikosDataSourceBean xadataSourceBean = new AtomikosDataSourceBean();
xadataSourceBean.setXaDataSource(mysqlXADataSource);
xadataSourceBean.setUniqueResourceName(resourceName);
xadataSourceBean.setMinPoolSize(minPoolSize);
xadataSourceBean.setMaxPoolSize(maxPoolSize);
xadataSourceBean.setMaxLifetime(maxLifetime);
xadataSourceBean.setBorrowConnectionTimeout(borrowConnectionTimeout);
xadataSourceBean.setLoginTimeout(seconds);
xadataSourceBean.setMaintenanceInterval(maintenanceInterval);
xadataSourceBean.setMaxIdleTime(maxIdleTime);
xadataSourceBean.setTestQuery(testQuery);
return xadataSourceBean;
}
/**
* 创建sqlsessionfactory
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "userSessionFactory")
public SqlSessionFactory userSessionFactory(@Qualifier("userDataSource") DataSource dataSource) throws Exception{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean.getObject();
}
/**
* 创建管理器(独自使用的时候用这个事务管理器,多事务管理器不用这个,用上面的xadataSource)
* @param dataSource
* @return
*/
* public DataSourceTransactionManager
* userTransactionManager(@Qualifier("userDataSource") DataSource dataSource){
* return new DataSourceTransactionManager(dataSource);
*}
/**
* 创建user sqlsession模版
*
*/
@Bean(name = "userSqlSessionTemplate")
public SqlSessionTemplate userSqlSessionTemplate(@Qualifier("userSessionFactory") SqlSessionFactory userSessionFactory){
return new SqlSessionTemplate(userSessionFactory);
}
}
(4) 启动类中加上EnableConfigurationProperties({UserConfig.class}) 启动服务就OK了