好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot使用Atomikos技术整合多数据源的实现

Atomikos是一个为Java平台提供增值服务的并且开源类事务管理器,如果将事务统一注册到Atomikos中,则可以统一管理。常用于后台管理系统的多数据库操作。

多数据源的划分方式

方式: a、按包名 b、按注解区分
Springboot默认集成事务,只主要在方法上加上@Transactional即可,不需要开启@EnableTransactionManagement注解
如果多个数据库,则每个方法都需要单独设置事务管理器@Transactional(transactionManager = "test2TransactionManager"),如果事务中含多数据源则无效。

Atomikos使用

1.依赖引入

?

1

2

3

4

< dependency >

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

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

</ dependency >

2.多数据源配置文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# Mysql 1

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

mysql.datasource.test1.username = root

mysql.datasource.test1.password = root

mysql.datasource.test1.minPoolSize = 3

mysql.datasource.test1.maxPoolSize = 25

mysql.datasource.test1.maxLifetime = 20000

mysql.datasource.test1.borrowConnectionTimeout = 30

mysql.datasource.test1.loginTimeout = 30

mysql.datasource.test1.maintenanceInterval = 60

mysql.datasource.test1.maxIdleTime = 60

 

# Mysql 2

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

mysql.datasource.test2.username =root

mysql.datasource.test2.password =root

mysql.datasource.test2.minPoolSize = 3

mysql.datasource.test2.maxPoolSize = 25

mysql.datasource.test2.maxLifetime = 20000

mysql.datasource.test2.borrowConnectionTimeout = 30

mysql.datasource.test2.loginTimeout = 30

mysql.datasource.test2.maintenanceInterval = 60

mysql.datasource.test2.maxIdleTime = 60

3.配置代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

@Data

@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;

}

 

@Data

@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;

}

 

@Configuration

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

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

public class MyBatisConfig1 {

 

   // 配置数据源

   @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);

   }

}

 

@Configuration

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

public class MyBatisConfig2 {

 

   // 配置数据源

   @Bean (name = "test2DataSource" )

   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( "test2DataSource" );

 

     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 = "test2SqlSessionFactory" )

   public SqlSessionFactory testSqlSessionFactory( @Qualifier ( "test2DataSource" ) DataSource dataSource)

       throws Exception {

     SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

     bean.setDataSource(dataSource);

     return bean.getObject();

   }

 

   @Bean (name = "test2SqlSessionTemplate" )

   public SqlSessionTemplate testSqlSessionTemplate(

       @Qualifier ( "test2SqlSessionFactory" ) SqlSessionFactory sqlSessionFactory) throws Exception {

     return new SqlSessionTemplate(sqlSessionFactory);

   }

}

4.启动加载配置

@EnableConfigurationProperties(value = { DBConfig1.class, DBConfig2.class })
使用还是正常使用@Transactional方式

到此这篇关于SpringBoot使用Atomikos技术整合多数据源的实现的文章就介绍到这了,更多相关SpringBoot Atomikos多数据源内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持! 

原文链接:https://HdhCmsTestjianshu测试数据/p/00e0f625518d

查看更多关于SpringBoot使用Atomikos技术整合多数据源的实现的详细内容...

  阅读:16次