springboot分布式事务管理(atomikos)

1.引用jta-atomikos架包

 

 
  1. <dependency>

  2. <groupId>org.springframework.boot</groupId>

  3. <artifactId>spring-boot-starter-jta-atomikos</artifactId>

  4. </dependency>


 

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

 
  1. # Mysql 1

  2. mysql.datasource.test1.url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8

  3. mysql.datasource.test1.username = root

  4. mysql.datasource.test1.password = root

  5. mysql.datasource.test1.minPoolSize = 3

  6. mysql.datasource.test1.maxPoolSize = 25

  7. mysql.datasource.test1.maxLifetime = 20000

  8. mysql.datasource.test1.borrowConnectionTimeout = 30

  9. mysql.datasource.test1.loginTimeout = 30

  10. mysql.datasource.test1.maintenanceInterval = 60

  11. mysql.datasource.test1.maxIdleTime = 60

  12. mysql.datasource.test1.testQuery = select 1

  13.  
  14.  
  15. # Mysql 2

  16. mysql.datasource.test2.url =jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8

  17. mysql.datasource.test2.username =root

  18. mysql.datasource.test2.password =root

  19.  
  20. mysql.datasource.test2.minPoolSize = 3

  21. mysql.datasource.test2.maxPoolSize = 25

  22. mysql.datasource.test2.maxLifetime = 20000

  23. mysql.datasource.test2.borrowConnectionTimeout = 30

  24. mysql.datasource.test2.loginTimeout = 30

  25. mysql.datasource.test2.maintenanceInterval = 60

  26. mysql.datasource.test2.maxIdleTime = 60

  27. mysql.datasource.test2.testQuery = select 1

 

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

DBConfig1.java

 

 
  1. package com.itmayiedu.config;

  2.  
  3. import org.springframework.boot.context.properties.ConfigurationProperties;

  4.  
  5. @ConfigurationProperties(prefix = "mysql.datasource.test1")

  6. public class DBConfig1 {

  7.  
  8. private String url;

  9. private String username;

  10. private String password;

  11. private int minPoolSize;

  12. private int maxPoolSize;

  13. private int maxLifetime;

  14. private int borrowConnectionTimeout;

  15. private int loginTimeout;

  16. private int maintenanceInterval;

  17. private int maxIdleTime;

  18. private String testQuery;

  19. public String getUrl() {

  20. return url;

  21. }

  22. public void setUrl(String url) {

  23. this.url = url;

  24. }

  25. public String getUsername() {

  26. return username;

  27. }

  28. public void setUsername(String username) {

  29. this.username = username;

  30. }

  31. public String getPassword() {

  32. return password;

  33. }

  34. public void setPassword(String password) {

  35. this.password = password;

  36. }

  37. public int getMinPoolSize() {

  38. return minPoolSize;

  39. }

  40. public void setMinPoolSize(int minPoolSize) {

  41. this.minPoolSize = minPoolSize;

  42. }

  43. public int getMaxPoolSize() {

  44. return maxPoolSize;

  45. }

  46. public void setMaxPoolSize(int maxPoolSize) {

  47. this.maxPoolSize = maxPoolSize;

  48. }

  49. public int getMaxLifetime() {

  50. return maxLifetime;

  51. }

  52. public void setMaxLifetime(int maxLifetime) {

  53. this.maxLifetime = maxLifetime;

  54. }

  55. public int getBorrowConnectionTimeout() {

  56. return borrowConnectionTimeout;

  57. }

  58. public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {

  59. this.borrowConnectionTimeout = borrowConnectionTimeout;

  60. }

  61. public int getLoginTimeout() {

  62. return loginTimeout;

  63. }

  64. public void setLoginTimeout(int loginTimeout) {

  65. this.loginTimeout = loginTimeout;

  66. }

  67. public int getMaintenanceInterval() {

  68. return maintenanceInterval;

  69. }

  70. public void setMaintenanceInterval(int maintenanceInterval) {

  71. this.maintenanceInterval = maintenanceInterval;

  72. }

  73. public int getMaxIdleTime() {

  74. return maxIdleTime;

  75. }

  76. public void setMaxIdleTime(int maxIdleTime) {

  77. this.maxIdleTime = maxIdleTime;

  78. }

  79. public String getTestQuery() {

  80. return testQuery;

  81. }

  82. public void setTestQuery(String testQuery) {

  83. this.testQuery = testQuery;

  84. }

  85.  
  86. }

  87.  
  88.  

DBConfig2.java

 

 
  1. package com.itmayiedu.config;

  2.  
  3. import org.springframework.boot.context.properties.ConfigurationProperties;

  4.  
  5. @ConfigurationProperties(prefix = "mysql.datasource.test2")

  6. public class DBConfig2 {

  7.  
  8. private String url;

  9. private String username;

  10. private String password;

  11. private int minPoolSize;

  12. private int maxPoolSize;

  13. private int maxLifetime;

  14. private int borrowConnectionTimeout;

  15. private int loginTimeout;

  16. private int maintenanceInterval;

  17. private int maxIdleTime;

  18. private String testQuery;

  19. public String getUrl() {

  20. return url;

  21. }

  22. public void setUrl(String url) {

  23. this.url = url;

  24. }

  25. public String getUsername() {

  26. return username;

  27. }

  28. public void setUsername(String username) {

  29. this.username = username;

  30. }

  31. public String getPassword() {

  32. return password;

  33. }

  34. public void setPassword(String password) {

  35. this.password = password;

  36. }

  37. public int getMinPoolSize() {

  38. return minPoolSize;

  39. }

  40. public void setMinPoolSize(int minPoolSize) {

  41. this.minPoolSize = minPoolSize;

  42. }

  43. public int getMaxPoolSize() {

  44. return maxPoolSize;

  45. }

  46. public void setMaxPoolSize(int maxPoolSize) {

  47. this.maxPoolSize = maxPoolSize;

  48. }

  49. public int getMaxLifetime() {

  50. return maxLifetime;

  51. }

  52. public void setMaxLifetime(int maxLifetime) {

  53. this.maxLifetime = maxLifetime;

  54. }

  55. public int getBorrowConnectionTimeout() {

  56. return borrowConnectionTimeout;

  57. }

  58. public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {

  59. this.borrowConnectionTimeout = borrowConnectionTimeout;

  60. }

  61. public int getLoginTimeout() {

  62. return loginTimeout;

  63. }

  64. public void setLoginTimeout(int loginTimeout) {

  65. this.loginTimeout = loginTimeout;

  66. }

  67. public int getMaintenanceInterval() {

  68. return maintenanceInterval;

  69. }

  70. public void setMaintenanceInterval(int maintenanceInterval) {

  71. this.maintenanceInterval = maintenanceInterval;

  72. }

  73. public int getMaxIdleTime() {

  74. return maxIdleTime;

  75. }

  76. public void setMaxIdleTime(int maxIdleTime) {

  77. this.maxIdleTime = maxIdleTime;

  78. }

  79. public String getTestQuery() {

  80. return testQuery;

  81. }

  82. public void setTestQuery(String testQuery) {

  83. this.testQuery = testQuery;

  84. }

  85.  
  86. }



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

TestMyBatisConfig1

 
  1. package com.itmayiedu.datasource;

  2.  
  3. import java.sql.SQLException;

  4.  
  5. import javax.sql.DataSource;

  6.  
  7. import org.apache.ibatis.session.SqlSessionFactory;

  8. import org.mybatis.spring.SqlSessionFactoryBean;

  9. import org.mybatis.spring.SqlSessionTemplate;

  10. import org.mybatis.spring.annotation.MapperScan;

  11. import org.springframework.beans.factory.annotation.Qualifier;

  12. import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;

  13. import org.springframework.context.annotation.Bean;

  14. import org.springframework.context.annotation.Configuration;

  15. import org.springframework.context.annotation.Primary;

  16.  
  17. import com.itmayiedu.config.DBConfig1;

  18. import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;

  19.  
  20. @Configuration

  21. @MapperScan(basePackages = "com.itmayiedu.test01", sqlSessionTemplateRef = "testSqlSessionTemplate")

  22. public class TestMyBatisConfig1 {

  23.  
  24. // 配置数据源

  25. @Primary

  26. @Bean(name = "testDataSource")

  27. public DataSource testDataSource(DBConfig1 testConfig) throws SQLException {

  28. MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();

  29. mysqlXaDataSource.setUrl(testConfig.getUrl());

  30. mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);

  31. mysqlXaDataSource.setPassword(testConfig.getPassword());

  32. mysqlXaDataSource.setUser(testConfig.getUsername());

  33. mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);

  34.  
  35. AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();

  36. xaDataSource.setXaDataSource(mysqlXaDataSource);

  37. xaDataSource.setUniqueResourceName("testDataSource");

  38.  
  39. xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());

  40. xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());

  41. xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());

  42. xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());

  43. xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());

  44. xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());

  45. xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());

  46. xaDataSource.setTestQuery(testConfig.getTestQuery());

  47. return xaDataSource;

  48. }

  49. @Primary

  50. @Bean(name = "testSqlSessionFactory")

  51. public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource)

  52. throws Exception {

  53. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

  54. bean.setDataSource(dataSource);

  55. return bean.getObject();

  56. }

  57.  
  58. @Primary

  59. @Bean(name = "testSqlSessionTemplate")

  60. public SqlSessionTemplate testSqlSessionTemplate(

  61. @Qualifier("testSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

  62. return new SqlSessionTemplate(sqlSessionFactory);

  63. }

  64. }


TestMyBatisConfig2

 

 
  1. package com.itmayiedu.datasource;

  2.  
  3. import java.sql.SQLException;

  4.  
  5. import javax.sql.DataSource;

  6.  
  7. import org.apache.ibatis.session.SqlSessionFactory;

  8. import org.mybatis.spring.SqlSessionFactoryBean;

  9. import org.mybatis.spring.SqlSessionTemplate;

  10. import org.mybatis.spring.annotation.MapperScan;

  11. import org.springframework.beans.factory.annotation.Qualifier;

  12. import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;

  13. import org.springframework.context.annotation.Bean;

  14. import org.springframework.context.annotation.Configuration;

  15.  
  16. import com.itmayiedu.config.DBConfig1;

  17. import com.itmayiedu.config.DBConfig2;

  18. import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;

  19.  
  20. @Configuration

  21. //basePackages 最好分开配置 如果放在同一个文件夹可能会报错

  22. @MapperScan(basePackages = "com.itmayiedu.test02", sqlSessionTemplateRef = "testSqlSessionTemplate2")

  23. public class TestMyBatisConfig2 {

  24.  
  25. // 配置数据源

  26. @Bean(name = "testDataSource2")

  27. public DataSource testDataSource(DBConfig2 testConfig) throws SQLException {

  28. MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();

  29. mysqlXaDataSource.setUrl(testConfig.getUrl());

  30. mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);

  31. mysqlXaDataSource.setPassword(testConfig.getPassword());

  32. mysqlXaDataSource.setUser(testConfig.getUsername());

  33. mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);

  34.  
  35. AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();

  36. xaDataSource.setXaDataSource(mysqlXaDataSource);

  37. xaDataSource.setUniqueResourceName("testDataSource2");

  38.  
  39. xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());

  40. xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());

  41. xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());

  42. xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());

  43. xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());

  44. xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());

  45. xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());

  46. xaDataSource.setTestQuery(testConfig.getTestQuery());

  47. return xaDataSource;

  48. }

  49.  
  50. @Bean(name = "testSqlSessionFactory2")

  51. public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource2") DataSource dataSource)

  52. throws Exception {

  53. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

  54. bean.setDataSource(dataSource);

  55. return bean.getObject();

  56. }

  57.  
  58. @Bean(name = "testSqlSessionTemplate2")

  59. public SqlSessionTemplate testSqlSessionTemplate(

  60. @Qualifier("testSqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {

  61. return new SqlSessionTemplate(sqlSessionFactory);

  62. }

  63. }


外加附上service层代码

 

 
  1. package com.itmayiedu.test01.service;

  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.stereotype.Service;

  5. import org.springframework.transaction.annotation.Transactional;

  6.  
  7. import com.itmayiedu.entity.UserEntity;

  8. import com.itmayiedu.test01.mapping.UserMapper1;

  9. import com.itmayiedu.test02.mapping.UserMapper2;

  10.  
  11. @Service

  12. public class UserService1 {

  13. @Autowired

  14. private UserMapper1 userMapper1;

  15.  
  16. @Autowired

  17. private UserMapper2 userMapper2;

  18.  
  19. @Transactional

  20. public int addUser1 (UserEntity userEntity){

  21. userMapper2.addUser(userEntity.getName(), userEntity.getAge());

  22. userMapper1.addUser(userEntity.getName(), userEntity.getAge());

  23. return 1;

  24. }

  25. }

--------------------- 本文来自 WI_232995 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/WI_232995/article/details/78124885?utm_source=copy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值