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协议的资源管理器(ResourceManager)。
资源管理器是任意类型的持久化数据存储容器,例如在开发中常用的关系型数据库:MySQL,Oracle等,消息中间件RocketMQ、RabbitMQ等。
事务管理器提供事务声明,事务资源管理,同步,事务上下文传播等功能,并且负责着所有事务参与单元者的相互通讯的责任。JTA规范定义了事务管理器与其他事务参与者交互的接口,其他的事务参与者与事务管理器进行交互。
二、SpringBoot整合JTA
项目整体结构图
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") 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); @Resource privateDruidOneParamdruidOneParam; @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注解即可,这样保证数据在两个数据源间也可以保证一致性。
@Service publicclassTransferServiceImplimplementsTransferService{ @Resource privateUserAccount01MapperuserAccount01Mapper; @Resource privateUserAccount02MapperuserAccount02Mapper; @Override publicvoidtransfer01(){ userAccount01Mapper.transfer("jack",100); System.out.println("i="+1/0); userAccount02Mapper.transfer("tom",100); } @Transactional @Override publicvoidtransfer02(){ userAccount01Mapper.transfer("jack",200); System.out.println("i="+1/0); userAccount02Mapper.transfer("tom",200); } }
三、JTA组件小结
在上面JTA实现多数据源的事务管理,使用方式还是相对简单,通过两阶段的提交,可以同时管理多个数据源的事务。但是暴露出的问题也非常明显,就是比较严重的性能问题,由于同时操作多个数据源,如果其中一个数据源获取数据的时间过长,会导致整个请求都非常的长,事务时间太长,锁数据的时间就会太长,自然就会导致低性能和低吞吐量。
因此在实际开发过程中,对性能要求比较高的系统很少使用JTA组件做事务管理。作为一个轻量级的分布式事务解决方案,在小的系统中还是值得推荐尝试的。
最后作为Java下的API,原理和用法还是值得学习一下,开阔眼界和思路。
四、源代码地址
GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent
到此这篇关于SpringBoot2整合JTA组件实现多数据源事务管理的文章就介绍到这了,更多相关SpringBoot2JTA多数据源事务管理内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。