springboot jta atomikos实现分布式事物管理

前端之家收集整理的这篇文章主要介绍了springboot jta atomikos实现分布式事物管理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这篇文章主要介绍了springboot jta atomikos实现分布式事物管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

当项目在连接多个数据库时可能会发生事务问题,即一个库的事务不可能去操作另一个数据库的事务,这时就需要使用atomikos对数据库的事务进行统一的管理

第一步添加atomikos的依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jta-atomikos</artifactId>
  4. </dependency>

第二步配置数据源,我这里有2个数据库(ruan和youxianqi),你有多少就加多少。

  1. spring:
  2. datasource:
  3. system:
  4. jdbc-url: jdbc:oracle:thin:@localhost:1521/orcl
  5. driver-class-name: oracle.jdbc.OracleDriver
  6. username: yuan
  7. password: 1234
  8. initial-size: 5
  9. min-idle: 5
  10. max-active: 20
  11. min-evictable-idle-time-millis: 300000
  12. validation-query: SELECT 1 FROM DUAL
  13. test-while-idle: true
  14. kllogt:
  15. jdbc-url: jdbc:oracle:thin:@localhost:1521/orcl
  16. driver-class-name: oracle.jdbc.OracleDriver
  17. username: youxianqi
  18. password: youxianqi
  19. initial-size: 5
  20. min-idle: 5
  21. max-active: 20
  22. min-evictable-idle-time-millis: 300000
  23. validation-query: SELECT 1 FROM DUAL
  24. test-while-idle: true
  25. logging:
  26. level:
  27. org.springframework.web: debug

然后创建DBConfig1和DBConfig2,这两个实体类就是存放两个数据源的数据的。

  1. package com.cgb.config;
  2.  
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4.  
  5. @ConfigurationProperties(prefix = "spring.datasource.system")
  6. public class DBConfig1 {
  7.  
  8. private String jdbc-url;
  9. private String username;
  10. private String password;
  11.  
  12. private int minPoolSize;
  13.  
  14. private int maxPoolSize;
  15.  
  16. private int maxLifetime;
  17.  
  18. private int borrowConnectionTimeout;
  19.  
  20. private int loginTimeout;
  21.  
  22. private int maintenanceInterval;
  23.  
  24. private int maxIdleTime;
  25.  
  26. private String testQuery;
  27.  
  28. public String getJdbc-url() {
  29. return url;
  30. }
  31.  
  32. public void setJdbc-url(String jdbc-url) {
  33. this.jdbc-url= jdbc-url;
  34. }
  35.  
  36. public String getUsername() {
  37. return username;
  38. }
  39.  
  40. public void setUsername(String username) {
  41. this.username = username;
  42. }
  43.  
  44. public String getPassword() {
  45. return password;
  46. }
  47.  
  48. public void setPassword(String password) {
  49. this.password = password;
  50. }
  51.  
  52. public int getMinPoolSize() {
  53. return minPoolSize;
  54. }
  55.  
  56. public void setMinPoolSize(int minPoolSize) {
  57. this.minPoolSize = minPoolSize;
  58. }
  59.  
  60. public int getMaxPoolSize() {
  61. return maxPoolSize;
  62. }
  63.  
  64. public void setMaxPoolSize(int maxPoolSize) {
  65. this.maxPoolSize = maxPoolSize;
  66. }
  67.  
  68. public int getMaxLifetime() {
  69. return maxLifetime;
  70. }
  71.  
  72. public void setMaxLifetime(int maxLifetime) {
  73. this.maxLifetime = maxLifetime;
  74. }
  75.  
  76. public int getBorrowConnectionTimeout() {
  77. return borrowConnectionTimeout;
  78. }
  79.  
  80. public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {
  81. this.borrowConnectionTimeout = borrowConnectionTimeout;
  82. }
  83.  
  84. public int getLoginTimeout() {
  85. return loginTimeout;
  86. }
  87.  
  88. public void setLoginTimeout(int loginTimeout) {
  89. this.loginTimeout = loginTimeout;
  90. }
  91.  
  92. public int getMaintenanceInterval() {
  93. return maintenanceInterval;
  94. }
  95.  
  96. public void setMaintenanceInterval(int maintenanceInterval) {
  97. this.maintenanceInterval = maintenanceInterval;
  98. }
  99.  
  100. public int getMaxIdleTime() {
  101. return maxIdleTime;
  102. }
  103.  
  104. public void setMaxIdleTime(int maxIdleTime) {
  105. this.maxIdleTime = maxIdleTime;
  106. }
  107.  
  108. public String getTestQuery() {
  109. return testQuery;
  110. }
  111.  
  112. public void setTestQuery(String testQuery) {
  113. this.testQuery = testQuery;
  114. }
  115.  
  116. }

然后创建两个数据源RuanMyBatisConfig和YouMyBatisConfig,注意@Primary注解只能有一个。

  1. package com.cgb.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.context.annotation.Bean;
  13. import org.springframework.context.annotation.Configuration;
  14. import org.springframework.context.annotation.Primary;
  15. import com.atomikos.jdbc.AtomikosDataSourceBean;
  16. import com.cgb.config.DBConfig1;
  17. import com.MysqL.jdbc.jdbc2.optional.MysqLXADataSource;
  18.  
  19. @Configuration
  20. @MapperScan(basePackages = "com.cgb.ruan",sqlSessionTemplateRef = "testsqlSessionTemplate")
  21. public class RuanMyBatisConfig {
  22.  
  23. // 配置数据源
  24. @Primary
  25. @Bean(name = "dataSource1")
  26. public DataSource testDataSource(DBConfig1 testConfig) throws sqlException {
  27. MysqLXADataSource MysqLXaDataSource = new MysqLXADataSource();
  28. MysqLXaDataSource.setUrl(testConfig.getUrl());
  29. MysqLXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  30. MysqLXaDataSource.setPassword(testConfig.getPassword());
  31. MysqLXaDataSource.setUser(testConfig.getUsername());
  32. MysqLXaDataSource.setPinGlobalTxToPhysicalConnection(true);
  33.  
  34. AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
  35. xaDataSource.setXaDataSource(MysqLXaDataSource);
  36. xaDataSource.setUniqueResourceName("dataSource1");
  37.  
  38. xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
  39. xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
  40. xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
  41. xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
  42. xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
  43. xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
  44. xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
  45. xaDataSource.setTestQuery(testConfig.getTestQuery());
  46. return xaDataSource;
  47. }
  48.  
  49. @Bean(name = "testsqlSessionFactory")
  50. public sqlSessionFactory testsqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource)
  51. throws Exception {
  52. sqlSessionfactorybean bean = new sqlSessionfactorybean();
  53. bean.setDataSource(dataSource);
  54. return bean.getObject();
  55. }
  56.  
  57. @Bean(name = "testsqlSessionTemplate")
  58. public sqlSessionTemplate testsqlSessionTemplate(
  59. @Qualifier("testsqlSessionFactory") sqlSessionFactory sqlSessionFactory) throws Exception {
  60. return new sqlSessionTemplate(sqlSessionFactory);
  61. }
  62. }

其实在多个数据源的时候,我们怎么去指定数据库呢?

其中一个做法是写注解,表明使用哪个数据库,但是这种是不是很麻烦。最好的做法是分包管理:

好啦,大功告成,我们来看看效果吧。

我们发现控制台打印添加生成功,好我们看看数据库里有没有数据呢?

毫无疑问是没有的,说明事务起作用了。那我们把那行异常代码注释掉,再看看效果。成功了,去看看数据库有没有呢。

ojbk,想想同时操作多个数据库,是不是很爽啊,哈哈哈。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

猜你在找的Springboot相关文章