springboot分布式事务管理(atomikos)

来源:互联网 发布:古天乐整容 知乎 编辑:程序博客网 时间:2024/05/29 08:55

最近公司有用到分布式事务管理,结合公司和我上网查询的一些资料,特来梳理一下我思路。

本篇文章使用时(atomikos)来进行springboot的分布式事务管理

1.引用jta-atomikos架包

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


2,首先配置数据源,因为是要演示分布式事务管理所以要配置多个数据源(2个)

# Mysql 1mysql.datasource.test1.url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8mysql.datasource.test1.username = rootmysql.datasource.test1.password = rootmysql.datasource.test1.minPoolSize = 3mysql.datasource.test1.maxPoolSize = 25mysql.datasource.test1.maxLifetime = 20000mysql.datasource.test1.borrowConnectionTimeout = 30mysql.datasource.test1.loginTimeout = 30mysql.datasource.test1.maintenanceInterval = 60mysql.datasource.test1.maxIdleTime = 60mysql.datasource.test1.testQuery = select 1# Mysql 2mysql.datasource.test2.url =jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8mysql.datasource.test2.username =rootmysql.datasource.test2.password =rootmysql.datasource.test2.minPoolSize = 3mysql.datasource.test2.maxPoolSize = 25mysql.datasource.test2.maxLifetime = 20000mysql.datasource.test2.borrowConnectionTimeout = 30mysql.datasource.test2.loginTimeout = 30mysql.datasource.test2.maintenanceInterval = 60mysql.datasource.test2.maxIdleTime = 60mysql.datasource.test2.testQuery = select 1


3,配置读取数据库属性文件

DBConfig1.java

package com.itmayiedu.config;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "mysql.datasource.test1")public class DBConfig1 {private String url;private String username;private String password;private int minPoolSize;private int maxPoolSize;private int maxLifetime;private int borrowConnectionTimeout;private int loginTimeout;private int maintenanceInterval;private int maxIdleTime;private String testQuery;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getMinPoolSize() {return minPoolSize;}public void setMinPoolSize(int minPoolSize) {this.minPoolSize = minPoolSize;}public int getMaxPoolSize() {return maxPoolSize;}public void setMaxPoolSize(int maxPoolSize) {this.maxPoolSize = maxPoolSize;}public int getMaxLifetime() {return maxLifetime;}public void setMaxLifetime(int maxLifetime) {this.maxLifetime = maxLifetime;}public int getBorrowConnectionTimeout() {return borrowConnectionTimeout;}public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {this.borrowConnectionTimeout = borrowConnectionTimeout;}public int getLoginTimeout() {return loginTimeout;}public void setLoginTimeout(int loginTimeout) {this.loginTimeout = loginTimeout;}public int getMaintenanceInterval() {return maintenanceInterval;}public void setMaintenanceInterval(int maintenanceInterval) {this.maintenanceInterval = maintenanceInterval;}public int getMaxIdleTime() {return maxIdleTime;}public void setMaxIdleTime(int maxIdleTime) {this.maxIdleTime = maxIdleTime;}public String getTestQuery() {return testQuery;}public void setTestQuery(String testQuery) {this.testQuery = testQuery;}}
DBConfig2.java

package com.itmayiedu.config;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "mysql.datasource.test2")public class DBConfig2 {private String url;private String username;private String password;private int minPoolSize;private int maxPoolSize;private int maxLifetime;private int borrowConnectionTimeout;private int loginTimeout;private int maintenanceInterval;private int maxIdleTime;private String testQuery;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getMinPoolSize() {return minPoolSize;}public void setMinPoolSize(int minPoolSize) {this.minPoolSize = minPoolSize;}public int getMaxPoolSize() {return maxPoolSize;}public void setMaxPoolSize(int maxPoolSize) {this.maxPoolSize = maxPoolSize;}public int getMaxLifetime() {return maxLifetime;}public void setMaxLifetime(int maxLifetime) {this.maxLifetime = maxLifetime;}public int getBorrowConnectionTimeout() {return borrowConnectionTimeout;}public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {this.borrowConnectionTimeout = borrowConnectionTimeout;}public int getLoginTimeout() {return loginTimeout;}public void setLoginTimeout(int loginTimeout) {this.loginTimeout = loginTimeout;}public int getMaintenanceInterval() {return maintenanceInterval;}public void setMaintenanceInterval(int maintenanceInterval) {this.maintenanceInterval = maintenanceInterval;}public int getMaxIdleTime() {return maxIdleTime;}public void setMaxIdleTime(int maxIdleTime) {this.maxIdleTime = maxIdleTime;}public String getTestQuery() {return testQuery;}public void setTestQuery(String testQuery) {this.testQuery = testQuery;}}


4,配置TestMyBatisConfig1,TestMyBatisConfig2,将两个数据源放入atomikos进行一个管理

TestMyBatisConfig1

package com.itmayiedu.datasource;import java.sql.SQLException;import javax.sql.DataSource;import org.apache.ibatis.session.SqlSessionFactory;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.jta.atomikos.AtomikosDataSourceBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import com.itmayiedu.config.DBConfig1;import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;@Configuration@MapperScan(basePackages = "com.itmayiedu.test01", sqlSessionTemplateRef = "testSqlSessionTemplate")public class TestMyBatisConfig1 {// 配置数据源@Primary@Bean(name = "testDataSource")public DataSource testDataSource(DBConfig1 testConfig) throws SQLException {MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();mysqlXaDataSource.setUrl(testConfig.getUrl());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);mysqlXaDataSource.setPassword(testConfig.getPassword());mysqlXaDataSource.setUser(testConfig.getUsername());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXaDataSource);xaDataSource.setUniqueResourceName("testDataSource");xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());xaDataSource.setTestQuery(testConfig.getTestQuery());return xaDataSource;}@Primary@Bean(name = "testSqlSessionFactory")public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}@Primary@Bean(name = "testSqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("testSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}}

TestMyBatisConfig2

package com.itmayiedu.datasource;import java.sql.SQLException;import javax.sql.DataSource;import org.apache.ibatis.session.SqlSessionFactory;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.jta.atomikos.AtomikosDataSourceBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.itmayiedu.config.DBConfig1;import com.itmayiedu.config.DBConfig2;import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;@Configuration//basePackages 最好分开配置 如果放在同一个文件夹可能会报错@MapperScan(basePackages = "com.itmayiedu.test02", sqlSessionTemplateRef = "testSqlSessionTemplate2")public class TestMyBatisConfig2 {// 配置数据源@Bean(name = "testDataSource2")public DataSource testDataSource(DBConfig2 testConfig) throws SQLException {MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();mysqlXaDataSource.setUrl(testConfig.getUrl());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);mysqlXaDataSource.setPassword(testConfig.getPassword());mysqlXaDataSource.setUser(testConfig.getUsername());mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXaDataSource);xaDataSource.setUniqueResourceName("testDataSource2");xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());xaDataSource.setTestQuery(testConfig.getTestQuery());return xaDataSource;}@Bean(name = "testSqlSessionFactory2")public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource2") DataSource dataSource)throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);return bean.getObject();}@Bean(name = "testSqlSessionTemplate2")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("testSqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}}

外加附上service层代码

package com.itmayiedu.test01.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.itmayiedu.entity.UserEntity;import com.itmayiedu.test01.mapping.UserMapper1;import com.itmayiedu.test02.mapping.UserMapper2;@Servicepublic class UserService1 {@Autowiredprivate UserMapper1 userMapper1;@Autowiredprivate UserMapper2 userMapper2;@Transactional public int addUser1 (UserEntity userEntity){ userMapper2.addUser(userEntity.getName(), userEntity.getAge()); userMapper1.addUser(userEntity.getName(), userEntity.getAge()); return 1; }}
其他的地方不需改动,到此已经结束。希望可以帮助到各位同学,写得有错误的地方,希望各位同学可以指证出来。谢谢!


原创粉丝点击