atomikosdatasourcebean mysql_SpringBoot2整合JTA组件实现多数据源事务管理

一、JTA组件简介

1、JTA基本概念

JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序对JTA的支持极大地增强了数据访问能力。

XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现JTA接口,开发人员只需要调用SpringJTA接口即可实现JTA事务管理功能。

JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中

2、分布式事务

分布式事务(DistributedTransaction)包括事务管理器(TransactionManager)和一个或多个支持 XA 协议的资源管理器 ( Resource Manager )。

资源管理器是任意类型的持久化数据存储容器,例如在开发中常用的关系型数据库:MySQL,Oracle等,消息中间件RocketMQ、RabbitMQ等。

事务管理器提供事务声明,事务资源管理,同步,事务上下文传播等功能,并且负责着所有事务参与单元者的相互通讯的责任。JTA规范定义了事务管理器与其他事务参与者交互的接口,其他的事务参与者与事务管理器进行交互。

二、SpringBoot整合JTA

项目整体结构图

e85c402f7b492c9330f62a0253f58f3a.png

1、核心依赖

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-jta-atomikos

2、环境配置

这里jtaManager的配置,在日志输出中非常关键。

spring:

jta:

transaction-manager-id: jtaManager

# 数据源配置

datasource:

type: com.alibaba.druid.pool.DruidDataSource

data01:

driverClassName: com.mysql.jdbc.Driver

dbUrl: jdbc:mysql://localhost:3306/data-one

username: root

password: 000000

data02:

driverClassName: com.mysql.jdbc.Driver

dbUrl: jdbc:mysql://localhost:3306/data-two

username: root

password: 000000

3、核心容器

这里两个数据库连接的配置手法都是一样的,可以在源码中自行下载阅读。基本思路都是把数据源交给JTA组件来统一管理,方便事务的通信。

数据源参数

@Component

@ConfigurationProperties(prefix = "spring.datasource.data01")

public class DruidOneParam {

private String dbUrl;

private String username;

private String password;

private String driverClassName;

}

JTA组件配置

package com.jta.source.conifg;

@Configuration

@MapperScan(basePackages = {"com.jta.source.mapper.one"},sqlSessionTemplateRef = "data01SqlSessionTemplate")

public class DruidOneConfig {

private static final Logger LOGGER = LoggerFactory.getLogger(DruidOneConfig.class) ;

@Resource

private DruidOneParam druidOneParam ;

@Primary

@Bean("dataSourceOne")

public DataSource dataSourceOne () {

// 设置数据库连接

MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();

mysqlXADataSource.setUrl(druidOneParam.getDbUrl());

mysqlXADataSource.setUser(druidOneParam.getUsername());

mysqlXADataSource.setPassword(druidOneParam.getPassword());

mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);

// 事务管理器

AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();

atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);

atomikosDataSourceBean.setUniqueResourceName("dataSourceOne");

return atomikosDataSourceBean;

}

@Primary

@Bean(name = "sqlSessionFactoryOne")

public SqlSessionFactory sqlSessionFactoryOne(

@Qualifier("dataSourceOne") DataSource dataSourceOne) throws Exception{

// 配置Session工厂

SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

sessionFactory.setDataSource(dataSourceOne);

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

sessionFactory.setMapperLocations(resolver.getResources("classpath*:/dataOneMapper/*.xml"));

return sessionFactory.getObject();

}

@Primary

@Bean(name = "data01SqlSessionTemplate")

public SqlSessionTemplate sqlSessionTemplate(

@Qualifier("sqlSessionFactoryOne") SqlSessionFactory sqlSessionFactory) {

// 配置Session模板

return new SqlSessionTemplate(sqlSessionFactory);

}

}

4、测试对比

这里通过两个方法测试结果做对比,在两个数据源之间进行数据操作时,只需要在接口方法加上@Transactional注解即可,这样保证数据在两个数据源间也可以保证一致性。

@Service

public class TransferServiceImpl implements TransferService {

@Resource

private UserAccount01Mapper userAccount01Mapper ;

@Resource

private UserAccount02Mapper userAccount02Mapper ;

@Override

public void transfer01() {

userAccount01Mapper.transfer("jack",100);

System.out.println("i="+1/0);

userAccount02Mapper.transfer("tom",100);

}

@Transactional

@Override

public void transfer02() {

userAccount01Mapper.transfer("jack",200);

System.out.println("i="+1/0);

userAccount02Mapper.transfer("tom",200);

}

}

三、JTA组件小结

在上面JTA实现多数据源的事务管理,使用方式还是相对简单,通过两阶段的提交,可以同时管理多个数据源的事务。但是暴露出的问题也非常明显,就是比较严重的性能问题,由于同时操作多个数据源,如果其中一个数据源获取数据的时间过长,会导致整个请求都非常的长,事务时间太长,锁数据的时间就会太长,自然就会导致低性能和低吞吐量。

因此在实际开发过程中,对性能要求比较高的系统很少使用JTA组件做事务管理。作为一个轻量级的分布式事务解决方案,在小的系统中还是值得推荐尝试的。

最后作为Java下的API,原理和用法还是值得学习一下,开阔眼界和思路。

四、源代码地址

到此这篇关于SpringBoot2整合JTA组件实现多数据源事务管理的文章就介绍到这了,更多相关SpringBoot2 JTA多数据源事务管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

crt 8.7.3 黑暗模式_民谣缠绕厄运金属,抒情中的黑暗故事

2020/7/31,瑞典厄运/重金属乐队Dun Ringill,发表了新专辑“Library of Death”。“Library Of Death”是瑞典乐队Dun Ringill的第二张唱片,由The Order of Israfel、Doomdogs等成员发起。乐队的声音,介于重金属和厄运金属之间&…

前窗玻璃膜贴了一周还有气泡_关于车窗玻璃的养护你了解多少?

【中国皮卡网 维修保养】车窗玻璃的养护是最容易忽视的,但它也是非常重要的,虽然在用车过程中我们很少直接接触车窗玻璃,但是它却时时刻刻在影响着驾驶者。相信很多人会有洗车的习惯,洗好之后的车窗玻璃非常明亮,不仅仅…

c语言新龟兔赛跑_幽默 | 新龟兔赛跑

新龟兔赛跑作者 / 何必加自从输给了乌龟后,兔子心里很是生气。这一天,他又遇见了乌龟,要求和他比赛,一定要一雪前耻。乌龟答应了,并且约定连比三场。第一场还是兔子输了,原来他一着急,跑错了方向…

bugku 杂项 就五层你能解开吗_长春老旧小区加装电梯,你家符合条件吗?_媒体_澎湃新闻...

新朋友戳蓝字关注我们哦!长春市老旧小区开始加装外置电梯大家都很关注很多市民也在想我家符合加装条件吗?能申请吗?伴随着长春市朝阳区3个老旧小区加装电梯工作的结束,这项惠民工程也成为了老百姓茶余饭后的谈资,那么大…

vba 指定列后插入列_Excle中的VBA介绍分享

SunYoung1、什么是VBAVisual Basic for Applications(VBA)是Visual Basic的一种 宏 语言,它能使常用的程序自动化,是针对Office开发的一种工具,通俗点讲,VBA是一种Excle能听懂识别的编程语言。2、在Excle中VBA的作用2.1、实现Exce…

php中文歌词,html如何制作滚动歌词

html制作滚动歌词的方法:首先在标签里面写好编码格式,引入css样式和jQuery;然后放置播放器,代码为【】。本教程操作环境:windows7系统、html5版,DELL G3电脑。html制作滚动歌词的方法:首先我们创…

docker run 服务名_在 WSL2.0 的 Ubuntu 18 里使用 Docker

近日,随着Windows 10 2004版本的发布,WSL 2经过了近一年的insider测试,现在也正式上线了。Windows 10 2004中引入了一个真实的Linux kernel,使得系统全部的系统调用更加兼容。这也是首次,Linux kernel安装在Windows系统…

vb.net如何查询电脑麦克风收到声音_EMUI 10.1 跨屏协同实测:这一次把你的手机「搬」进电脑...

智能手机发展到现在,我们越来越需要手机与其他设备进行互联互通。电脑是我们办公最常用的工具,手机则是生活必需设备,这两者的协同需求,自然也就成为了大多数用户的痛点。Apple 用隔空投送、接力、随航等连续互通功能来打造系统生…

gerber文件怎么导贴片坐标_SMT贴片工序

贴片,也称SMT,就是把元器件用贴片机设备贴装在印刷好的PCB板上。贴片这一过程之所以用“贴”字,是因为锡膏内有助焊剂的成分,有一定的粘性,能够在没有熔化的时候,也能够黏住元器件。SMT又称贴片&#xff0c…

es内嵌文档查询_ElasticSearch 文档的增删改查都不会?

本文主要是介绍 ElasticSearch 的文档增删改查和批量操作,同时会介绍一些 REST API 返回状态码的具体含义。我们先来看下这个表:这个表包含了 Index、Create、Read、Update、Delete 这五种方法,我们先来看下 CRUD 操作的 HTTP 请求都长什么样…

如何在ps添加箭头_「PS精选案例教程」制作斑驳生锈字体

这个教程会教您如何设计发光斑驳的字体特效,会教您运用PS滤镜和纹理图片,同时也诠释了如何运用笔刷和图层样式给最终的字体效果增添光感。来,先看看最终效果!第一步:创建一个1024*768的新文档。前景色#532118&#xff…

车辆调度 matlab,基于遗传算法的车辆调度问题的matlab源程序

越界 发表于 2013-7-8 09:16 有偿服务哦function chushis)K4; %最多4辆车inn100;%迭代次数上限citynum8;%需求点数量KMcitynumK1; %配送途径种类%产生初始种群mzeros(1,inn);mm;szeros(inn,citynumK1);for i1:1:inns(i,:)randperm(KM); %随机排列构成个体ends[m s];for i1:inn…

strtotime()加半个小时_椰子鸡这样做太好吃了,一滴水不用加,鲜香嫩滑,做法非常简单...

转眼就是6月了,时间真的好快啊,好似白驹过隙,一眼就过去了。刚刚还是桃花开的时候,转眼五月桃都熟了。不得不说,李煜说得很对,“林花谢了春红,太匆匆!”6月了,6月有什么呢…

webpack 入口文件 php,如何实现webpack多入口文件打包配置

本篇文章主要介绍了webpack多入口文件页面打包配置详解,现在分享给大家,也给大家做个参考。大多数情况下,我们使用 webpack来打包单页应用程序,这个时候只需要配置一个入口,一个模板文件,但也不尽是如此&am…

接口里面的方法都是抽象方法吗_大家都在讲高中学习的方法有哪些,那方法和技巧有什么异同的吗?...

大家都在讲高中学习的方法有哪些,那方法和技巧有什么异同吗?高中怎样学习,方法重要还是技巧更重要?老牛倒是觉得,二者密不可分,缺一不可。那么,我们一起来看看,高中怎样学习才是最好…

python 笔试题 英方_4000字转型数据分析师笔试面试经验分享

大家好,我是戴师兄~在上一篇文章中我分享了快速自学数据分析的经验。本篇文章,我将跟大家分享下我的笔试和面试心得。开头先说说我转型前的职业背景:想看笔试面试经验的同学萌可以直接跳过这一段~2018年我从中国人民大学经济管理学专业毕业&a…

android 抓取webview中的所有图片_如何一键提取PDF文档中的所有图片?

原标题:如何一键提取PDF文档中的所有图片?目前PDF文档被大家广泛应用,主要是因为PDF文档在传输和转换的过程中比较稳定,所以PDF格式几乎是办公文件格式的首选。大家都知道PDF文档转换格式以及编辑都需要专门的PDF编辑器来实现。但…

php shell 交互,通过 Tinker 实现 Laravel 命令行交互式 Shell

通过 Tinker 实现 Laravel 命令行交互式 Shell由 学院君 创建于2年前, 最后更新于 1年前版本号 #19508 views4 likes0 collectsREPL 与 PsySHLaravel 自带了一个功能强大的 REPL —— Tinker,所谓 REPL,是 Read–Eval–Print-Loop 的缩写,这是…

戴尔电脑好还是华为好_华硕和戴尔笔记本哪种好 华硕和戴尔优缺点分析【详解】...

随着时代快速的发展,笔记本电脑已经成了我们生活中的标配。如今,市面上笔记本电脑的款式众多,相信大家对华硕和戴尔并不陌生吧!那么,我们该怎么去选择呢?今天小编就给大家介绍华硕和戴尔笔记本哪个好&#…

电脑扫描二维码_线上分享 | 网络工作坊:平板电脑工作术

澳门生产力暨科技转移中心将于9月29日下午3时,举办资讯科技工具应用线上工作坊,讲解平板电脑办公应用,欢迎有兴趣人士报名,名额有限,先到先得。该中心早前已举办是次主题的应用工作坊,坊间反应积极&#xf…