gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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://www.jianshu.com/p/00e0f625518d 。

最后此篇关于SpringBoot使用Atomikos技术整合多数据源的实现的文章就讲到这里了,如果你想了解更多关于SpringBoot使用Atomikos技术整合多数据源的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com