SpringBoot2中如何使用JTA组件实现多数据源事务管理(JTA,springboot,编程语言)

时间:2024-05-02 03:40:37 作者 : 石家庄SEO 分类 : 编程语言
  • TAG :

一、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

项目整体结构图

SpringBoot2中如何使用JTA组件实现多数据源事务管理

1、核心依赖

<!--SpringBoot核心依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--JTA组件核心依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId></dependency>

2、环境配置

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

spring:jta:transaction-manager-id:jtaManager#数据源配置datasource:type:com.alibaba.druid.pool.DruidDataSourcedata01:driverClassName:com.mysql.jdbc.DriverdbUrl:jdbc:mysql://localhost:3306/data-oneusername:rootpassword:000000data02:driverClassName:com.mysql.jdbc.DriverdbUrl:jdbc:mysql://localhost:3306/data-twousername:rootpassword:000000

3、核心容器

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

数据源参数

@Component@ConfigurationProperties(prefix="spring.datasource.data01")publicclassDruidOneParam{privateStringdbUrl;privateStringusername;privateStringpassword;privateStringdriverClassName;}

JTA组件配置

packagecom.jta.source.conifg;@Configuration@MapperScan(basePackages={"com.jta.source.mapper.one"},sqlSessionTemplateRef="data01SqlSessionTemplate")publicclassDruidOneConfig{privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(DruidOneConfig.class);@ResourceprivateDruidOneParamdruidOneParam;@Primary@Bean("dataSourceOne")publicDataSourcedataSourceOne(){//设置数据库连接MysqlXADataSourcemysqlXADataSource=newMysqlXADataSource();mysqlXADataSource.setUrl(druidOneParam.getDbUrl());mysqlXADataSource.setUser(druidOneParam.getUsername());mysqlXADataSource.setPassword(druidOneParam.getPassword());mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);//事务管理器AtomikosDataSourceBeanatomikosDataSourceBean=newAtomikosDataSourceBean();atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);atomikosDataSourceBean.setUniqueResourceName("dataSourceOne");returnatomikosDataSourceBean;}@Primary@Bean(name="sqlSessionFactoryOne")publicSqlSessionFactorysqlSessionFactoryOne(@Qualifier("dataSourceOne")DataSourcedataSourceOne)throwsException{//配置Session工厂SqlSessionFactoryBeansessionFactory=newSqlSessionFactoryBean();sessionFactory.setDataSource(dataSourceOne);ResourcePatternResolverresolver=newPathMatchingResourcePatternResolver();sessionFactory.setMapperLocations(resolver.getResources("classpath*:/dataOneMapper/*.xml"));returnsessionFactory.getObject();}@Primary@Bean(name="data01SqlSessionTemplate")publicSqlSessionTemplatesqlSessionTemplate(@Qualifier("sqlSessionFactoryOne")SqlSessionFactorysqlSessionFactory){//配置Session模板returnnewSqlSessionTemplate(sqlSessionFactory);}}

4、测试对比

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

@ServicepublicclassTransferServiceImplimplementsTransferService{@ResourceprivateUserAccount01MapperuserAccount01Mapper;@ResourceprivateUserAccount02MapperuserAccount02Mapper;@Overridepublicvoidtransfer01(){userAccount01Mapper.transfer("jack",100);System.out.println("i="+1/0);userAccount02Mapper.transfer("tom",100);}@Transactional@Overridepublicvoidtransfer02(){userAccount01Mapper.transfer("jack",200);System.out.println("i="+1/0);userAccount02Mapper.transfer("tom",200);}}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:SpringBoot2中如何使用JTA组件实现多数据源事务管理的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:SpringBoot中如何自定义Banner下一篇:

8 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18