SpringBoot2中如何使用JTA组件实现多数据源事务管理
导读:本文共3020.5字符,通常情况下阅读需要10分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 一、JTA组件简介1、JTA基本概念JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序对JTA的支持极大地增强了数据访问能力。XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现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
项目整体结构图
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组件实现多数据源事务管理的详细内容,希望对您有所帮助,信息来源于网络。