springboot整合多数据源解决分布式事务
一、前言
springboot整合多数据源解决分布式事务。
1.多数据源采用分包策略
2.全局分布式事务管理:jta-atomikos。
在此记录下,分享给大家。
二、springboot整合多数据源解决分布式事务
1、pom文件 依赖引入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<!-- SpringBoot 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- SpringBoot web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis 支持 SpringBoot -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 全局事务集中管理解决分布式事务 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
<!-- SpringBoot 自动配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 注解式插入/构建/优雅代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
</dependencies>
2、 application.yml 新增配置
spring:
datasource:
## 用户数据库
user:
url: jdbc:mysql://127.0.0.1:3306/yys_user
username: root
password: 123456
borrowConnectionTimeout: 30
loginTimeout: 30
maintenanceInterval: 60
maxIdleTime: 60
maxLifetime: 20000
maxPoolSize: 25
minPoolSize: 3
uniqueResourceName:
userDataSource
testQuery: select 1
## 订单数据库
order:
url: jdbc:mysql://127.0.0.1:3306/yys_order
username: root
password: 123456
borrowConnectionTimeout: 30
loginTimeout: 30
maintenanceInterval: 60
maxIdleTime: 60
maxLifeTime: 20000
maxPoolSize: 25
minPoolSize: 3
uniqueResourceName:
orderDataSource
testQuery: select 1
3、userConfig.java
@ConfigurationProperties(prefix = "spring.datasource.user")
@Data
public class UserConfig {
private String url;
private String userName;
private String password;
private int
minPoolSize;
private int
maxPoolSize;
private int
maxLifeTime;
private int
maxIdleTime;
private int
loginTimeout;
private int
maintenanceInterval;
private int borrowConnectionTimeout;
private String testQuery;
private String
uniqueResourceName;
}
4、userDataSourceConfig.java
/**
* 用户数据源
* Config
* @author yys
*/
@Configuration
@MapperScan(basePackages = "com.yys.user.mapper", sqlSessionTemplateRef
= "userSqlSessionTemplate")
public class UserDataSourceConfig {
/**
* 创建 XADataSource
* @return
*/
@Bean("userDataSource")
public DataSource userDataSource(UserConfig
userConfig) throws SQLException {
// 1、创建Mysql XADataSource
MysqlXADataSource
mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(userConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(userConfig.getPassword());
mysqlXaDataSource.setUser(userConfig.getUserName());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
// 2、将本地事务注册到 Atomikos 全局事务
AtomikosDataSourceBean
xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName(userConfig.getUniqueResourceName());
xaDataSource.setMinPoolSize(userConfig.getMinPoolSize());
xaDataSource.setMaxPoolSize(userConfig.getMaxPoolSize());
xaDataSource.setMaxLifetime(userConfig.getMaxLifeTime());
xaDataSource.setBorrowConnectionTimeout(userConfig.getBorrowConnectionTimeout());
xaDataSource.setLoginTimeout(userConfig.getLoginTimeout());
xaDataSource.setMaintenanceInterval(userConfig.getMaintenanceInterval());
xaDataSource.setMaxIdleTime(userConfig.getMaxIdleTime());
xaDataSource.setTestQuery(userConfig.getTestQuery());
return xaDataSource;
}
/**
* 创建 SQL会话工厂
* @param dataSource
* @return
* @throws Exception
*/
@Bean("userSqlSessionFactory")
public SqlSessionFactory userSqlSessionFactory(@Qualifier("userDataSource") DataSource
dataSource) throws Exception {
SqlSessionFactoryBean
sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return
sqlSessionFactoryBean.getObject();
}
/**
* 创建用户 SqlSession模板
* @param sqlSessionFactory
* @return
*/
@Bean("userSqlSessionTemplate")
public SqlSessionTemplate
userSqlSessionTemplate(@Qualifier("userSqlSessionFactory")
SqlSessionFactory sqlSessionFactory) {
return new
SqlSessionTemplate(sqlSessionFactory);
}
}
5、orderConfig.java
@ConfigurationProperties(prefix = "spring.datasource.order")
@Data
public class OrderConfig {
private String url;
private String userName;
private String password;
private int minPoolSize;
private int
maxPoolSize;
private int
maxLifeTime;
private int
maxIdleTime;
private int
loginTimeout;
private int
maintenanceInterval;
private int
borrowConnectionTimeout;
private String testQuery;
private String
uniqueResourceName;
}
6、orderDataSourceConfig.java
/**
* 订单数据源
* Config
* @author yys
*/
@Configuration
@MapperScan(basePackages = "com.yys.order.mapper",
sqlSessionTemplateRef = "orderSqlSessionTemplate")
public class OrderDataSourceConfig {
/**
* 创建 XADataSource
* @return
*/
@Bean("orderDataSource")
public DataSource orderDataSource(OrderConfig
orderConfig) throws SQLException {
// 1、创建Mysql XADataSource
MysqlXADataSource
mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(orderConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(orderConfig.getPassword());
mysqlXaDataSource.setUser(orderConfig.getUserName());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
// 2、将本地事务注册到 Atomikos 全局事务
AtomikosDataSourceBean xaDataSource
= new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName(orderConfig.getUniqueResourceName());
xaDataSource.setMinPoolSize(orderConfig.getMinPoolSize());
xaDataSource.setMaxPoolSize(orderConfig.getMaxPoolSize());
xaDataSource.setMaxLifetime(orderConfig.getMaxLifeTime());
xaDataSource.setBorrowConnectionTimeout(orderConfig.getBorrowConnectionTimeout());
xaDataSource.setLoginTimeout(orderConfig.getLoginTimeout());
xaDataSource.setMaintenanceInterval(orderConfig.getMaintenanceInterval());
xaDataSource.setMaxIdleTime(orderConfig.getMaxIdleTime());
xaDataSource.setTestQuery(orderConfig.getTestQuery());
return xaDataSource;
}
/**
* 创建 SQL会话工厂
* @param dataSource
* @return
* @throws Exception
*/
@Bean("orderSqlSessionFactory")
public SqlSessionFactory orderSqlSessionFactory(@Qualifier("orderDataSource") DataSource
dataSource) throws Exception {
SqlSessionFactoryBean
sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean.getObject();
}
/**
* 创建订单 SqlSession模板
* @param
sqlSessionFactory
* @return
*/
@Bean("orderSqlSessionTemplate")
public SqlSessionTemplate
orderSqlSessionTemplate(@Qualifier("orderSqlSessionFactory")
SqlSessionFactory sqlSessionFactory) {
return new
SqlSessionTemplate(sqlSessionFactory);
}
}
UserService.java
public class UserService {
@Autowired
private UserMapper
userMapper;
@Autowired
private OrderMapper
orderMapper;
// 全局事务处理器
// 事务底层原理采用aop技术做增强
// 无需再指定某个事务管理器,全交给 Atomikos 全局事务
@Transactional
public Boolean addUser(String name,
Integer age, Double amount, String address) {
// 操作用户库
int i =
userMapper.addUser(name, age);
// 操作订单库
int j =
orderMapper.addOrder(amount, address);
// 测试事务回滚(age = 0:回滚;age > 0:事务提交)
int flag = 1 / age;
return i > 0 && j
> 0;
}
}
springboot整合多数据源解决分布式事务
springboot整合多数据源解决分布式事务的更多相关文章
- RabbitMQ解决分布式事务
案例:经典案例,以目前流行点外卖的案例,用户下单后,调用订单服务,让后订单服务调用派单系统通知送外卖人员送单,这时候订单系统与派单系统采用MQ异步通讯. RabbitMQ解决分布式事务原理: 采用最终 ...
- 3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务
文章来自: https://blog.csdn.net/qq_29242877/article/details/79033287 在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据 ...
- 【分布式事务】使用atomikos+jta解决分布式事务问题
一.前言 分布式事务,这个问题困惑了小编很久,在3个月之前,就间断性的研究分布式事务.从MQ方面,数据库事务方面,jta方面.近期终于成功了,使用JTA解决了分布式事务问题.先写一下心得,后面的二级提 ...
- LCN解决分布式事务原理解析+项目实战(原创精华版)
写在前面: 原创不易,如果觉得不错推荐一下,谢谢! 由于工作需要,公司的微服务项目需解决分布式事务的问题,且由我进行分布式事务框架搭建和整合工作. 那么借此机会好好的将解决分布式事务的内容进行整理一下 ...
- 使用kafka消息队列解决分布式事务(可靠消息最终一致性方案-本地消息服务)
微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 本文转自:http://skaka.me/blog/2016/04/21/springcloud1/ 不同于单一 ...
- SpringBoot整合Mybatis,并实现事务控制
SpringBoot整合Mybatis,并实现事务控制 1. 在pom文件里添加相关maven文件 <parent> <groupId>org.springframework. ...
- 二、springboot项目使用seata实现分布式事务
所有文章 https://www.cnblogs.com/lay2017/p/12078232.html 正文 在上一篇文章中,我们简单地了解了一下什么是seata.它是来自阿里巴巴的内部项目不断地发 ...
- springBoot整合多数据源
springBoot整合相关 1:springBoot整合多数据源: 应用场景: 项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库. 工具/版本: jdk1. ...
- 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...
随机推荐
- vue(17)vue-route路由管理的安装与配置
介绍 Vue Router 是 Vue.js官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参 ...
- [刘阳Java]_JdbcTemplate用法_第11讲
JdbcTemplate模板提供操作数据库的方法应用,下面我们来说一下它的用法(注意:建议大家结合Spring API文档学习效果更好,因为下面的代码只是"抱砖引玉") 1. 遵循 ...
- oracle 密码详解以及破解
参考的相关资料等: https://docs.oracle.com/en/database/oracle/oracle-database/18/spmsu/finding-and-resetting- ...
- noip模拟26[肾炎黄·酱累黄·换莫黄]
\(noip模拟26\;solutions\) 这个题我做的确实是得心应手,为啥呢,因为前两次考试太难了 T1非常的简单,只不过我忘记了一个定理, T2就是一个小小的线段树,虽然吧我曾经说过我再也不写 ...
- Splay与FHQ-Treap
两个一起学的,就放一块了. 主要是用来存板子. Splay //This is a Splay Tree. #include <cstdio> #include <cstring&g ...
- C++引用的概念以及基本使用
引言 引用是C++的新增内容,在实际开发中会经常使用:C++用的引用就如同C语言的指针一样重要,但它比指针更加方便和易用. 我们知道,参数的传递本质上是一次赋值的过程,即将一块内存上的数据复制到另一块 ...
- win 10,Maven 配置
来源:https://www.cnblogs.com/lihan829/p/11503497.html 所需工具 : JDK 1.8 Maven 3.6.2 Windows 10 注Maven 3.2 ...
- python读取数据写入excel的四种操作
Python对Excel的读写主要有:xlrd.xlwt.xlutils.openpyxl.xlsxwriter几种 xlutils结合xlrd: 操作的是以xls后缀的excel,读取文件保留原格式 ...
- 第四十九篇 -- 添加联系人信息Addcontact
往通讯录里添加联系人 首先,在清单文件里添加读写权限 <uses-permission android:name="android.permission.READ_CONTACTS&q ...
- 面试问题记录 二 (数据库、Linux、Redis)
面试问题记录 二 (数据库.Linux.Redis) 前言 接着上次的面试问题记录,在最后还有几道问的数据结构方面的知识点要补充 还是那句话:如果文中解释有明显错误,劳烦请及时指正我,在这不胜感激!! ...