java多数据源事务处理_springboot整合多数据源解决分布式事务
一、前言
springboot整合多数据源解决分布式事务。
1.多数据源采用分包策略
2.全局分布式事务管理:jta-atomikos。
在此记录下,分享给大家。
二、springboot整合多数据源解决分布式事务
1、pom文件 依赖引入
org.springframework.boot
spring-boot-starter-parent
2.1.8.RELEASE
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.1.1
mysql
mysql-connector-java
5.1.38
org.springframework.boot
spring-boot-starter-jta-atomikos
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
1.18.4
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: select1
##订单数据库
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: select1
3、userConfig.java
@ConfigurationProperties(prefix ="spring.datasource.user")
@Data
publicclassUserConfig{
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
*@authoryys
*/
@Configuration
@MapperScan(basePackages ="com.yys.user.mapper", sqlSessionTemplateRef
="userSqlSessionTemplate")
publicclassUserDataSourceConfig{
/**
*创建XADataSource
*@return
*/
@Bean("userDataSource")
public DataSourceuserDataSource(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会话工厂
*@paramdataSource
*@return
*@throwsException
*/
@Bean("userSqlSessionFactory")
public SqlSessionFactoryuserSqlSessionFactory(@Qualifier("userDataSource") DataSource
dataSource) throws Exception {
SqlSessionFactoryBean
sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return
sqlSessionFactoryBean.getObject();
}
/**
*创建用户SqlSession模板
*@paramsqlSessionFactory
*@return
*/
@Bean("userSqlSessionTemplate")
public SqlSessionTemplateuserSqlSessionTemplate(@Qualifier("userSqlSessionFactory")
SqlSessionFactory sqlSessionFactory) {
return new
SqlSessionTemplate(sqlSessionFactory);
}
}
5、orderConfig.java
@ConfigurationProperties(prefix ="spring.datasource.order")
@Data
publicclassOrderConfig{
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
*@authoryys
*/
@Configuration
@MapperScan(basePackages ="com.yys.order.mapper",
sqlSessionTemplateRef ="orderSqlSessionTemplate")
publicclassOrderDataSourceConfig{
/**
*创建XADataSource
*@return
*/
@Bean("orderDataSource")
public DataSourceorderDataSource(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会话工厂
*@paramdataSource
*@return
*@throwsException
*/
@Bean("orderSqlSessionFactory")
public SqlSessionFactoryorderSqlSessionFactory(@Qualifier("orderDataSource") DataSource
dataSource) throws Exception {
SqlSessionFactoryBean
sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean.getObject();
}
/**
*创建订单SqlSession模板
*@paramsqlSessionFactory
*@return
*/
@Bean("orderSqlSessionTemplate")
public SqlSessionTemplateorderSqlSessionTemplate(@Qualifier("orderSqlSessionFactory")
SqlSessionFactory sqlSessionFactory) {
return new
SqlSessionTemplate(sqlSessionFactory);
}
}
UserService.java
publicclassUserService{
@Autowired
private UserMapper
userMapper;
@Autowired
private OrderMapper
orderMapper;
//全局事务处理器
//事务底层原理采用aop技术做增强
//无需再指定某个事务管理器,全交给Atomikos全局事务
@Transactional
public BooleanaddUser(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;
}
}
java多数据源事务处理_springboot整合多数据源解决分布式事务相关推荐
- SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合来实现Dubbo分布式事务
作者:请叫我东子 https://blog.csdn.net/u010046908/article/details/100536439 1.简介"本文主要介绍SpringBoot2.1.5 ...
- springboot 多数据源_SpringBoot整合多数据源的巨坑一
导读 本篇文章接上篇SpringBoot整合多数据源,你会了吗?,前面文章最后留了几个问题供大家思考,今天一一揭晓. 配置如何优化 上文整合的过程中的还顺带整合Mybatis和TransactionM ...
- springboot数据源不正确_SpringBoot整合多数据源的巨坑!!!
导读 本篇文章接上篇SpringBoot整合多数据源,你会了吗?,前面文章最后留了几个问题供大家思考,今天一一揭晓. 配置如何优化 上文整合的过程中的还顺带整合Mybatis和TransactionM ...
- java jta 例子_Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)...
在本系列先前的文章中,我们主要讲解了JDBC对本地事务的处理,本篇文章将讲到一个分布式事务的例子. 请通过以下方式下载github源代码: 本地事务和分布式事务的区别在于:本地事务只用于处理单一数据源 ...
- 2 数据源配置_SpringBoot 整合Druid与配置数据源监控
一:简绍 1.对于数据访问层,无论是SQL还是NOSQL 2.Spring Boot默认采用整合Spring Data的方式进行统一处理 3.添加大量自动配置,屏蔽了很多设置 1.官网描述 二:整合J ...
- opencv用java完成的例子_SpringBoot整合OpenCV的实现示例
简介 接下来会讲解怎么用SpringBoot整合OpenCV 初始化SpringBoot项目 这里正常初始一个SpringBoot项目 依赖文件 在安装目录下找到以下两个文件,如果不知道怎么安装Ope ...
- 【Sharding-JDBC】 (五)整合mybatis-plus 解决分布式事务(基于XA)
官网解释: 功能 支持数据分片后的跨库XA事务 两阶段提交保证操作的原子性和数据的强一致性 服务宕机重启后,提交/回滚中的事务可自动恢复 SPI机制整合主流的XA事务管理器,默认Atomikos,可以 ...
- springmvc atomikos mysql数据源_springboot+atomikos+多数据源管理事务(mysql 8.0)
jta:Java Transaction API,即是java中对事务处理的api 即 api即是接口的意思 atomikos:Atomikos TransactionsEssentials 是一个为 ...
- 一文详解 SpringBoot 多数据源中的分布式事务
作者 | 小涛 责编 | maozz 虽然现在微服务越来越流行,我们的系统随之也拆分出来好多的模块功能.这样做的目的其实就是为了弥补单体架构中存在的不足. 随着微服务的拆分,肯定设计到分库分表,但这之 ...
- spring整合atomikos实现分布式事务的方法示例_分布式-分布式事务处理
在之前的文章"如何合理的使用动态数据源"中,其实也提到了分布式事务相关的场景如:利用多数据源实现读写分离,但直接使用动态数据源频繁其实是很消耗资源的,而且就是当业务service一 ...
最新文章
- centos 配置php开发环境变量配置,CentOS中配置PHP和Nginx环境变量
- php的excel源码下载,PHPExcel-5 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...
- javase 的一些基础常用类
- html表格横向竖向滚动,利用纯css实现table固定列与表头中间横向滚动的思路和实例...
- c语言查看变量类型_c语言外部链接的静态变量的四种类型
- Hibernate持久化对象状态
- 【原创】Mysql客户端如何处理中文
- php 远程函数,php 远程图片保存到本地的函数类
- c语言 机器语言 汇编语言_多语言机器人新闻记者
- 树莓派十周年,回顾它的发展历程
- BP神经网络算法 原理讲解以及底层代码复现
- 网易邮箱与GMAIL
- 绕过 iOS 代码签名验证 ldid
- 匹兹堡大学计算机系世界排名,2019上海软科世界一流学科排名计算机科学与工程专业排名匹兹堡大学排名第101-150...
- UESTC 1601 艾尔大停电2 二维树状数组+区间更新
- 六点汽车保养小常识 保护爱车必修课
- 【QTdesigner】课时52.绘制各种图形(paintEevnt()))【pyqt5+QTdesigner模式】
- [附源码]计算机毕业设计高校体育场馆管理系统Springboot程序
- 中班机器人教室设计方案_机器人创客教室方案
- 理解MySQL——索引与优化篇