博客
关于我
数据源面试三连杀:是啥?为什么要用?怎么用?
阅读量:417 次
发布时间:2019-03-06

本文共 1602 字,大约阅读时间需要 5 分钟。

一、概述

在日常项目中,数据源是必不可少的。然而,当我们面对分布式事务时,数据源与传统的非分布式事务场景又有何不同?在J2EE环境中,分布式事务又是如何实现的?这些问题的解答就是本文的主要内容。

二、数据源

2.1 数据源是什么

数据源是存储数据的物理位置。在J2EE中,数据源通过Java对象接口表示。例如,数据库可以通过JDBC连接接口提供数据源。这些对象使J2EE应用能够与数据库进行交互,获取数据源。

2.2 数据源的设计

从UML图中可以看出,CommonDaraSource是对数据源概念的顶层抽象,规定了数据源必须实现的方法。数据源有三种主要实现类型:

  • DataSource:基本实现,用于生成标准Connection对象。
  • ConnectionPoolDataSource:连接池实现,通过逻辑连接池化管理数据库物理连接,减少频繁的连接创建和释放,提升性能。
  • XAConnection:专为分布式事务设计,生成XA支持的事务连接,并提供XAResource进行XA事务处理,支持多个资源的协调。

三、为什么需要XA数据源

3.1 XA数据源是什么

XA数据源指的是支持XA规范的数据源,能够参与分布式事务处理。XA规范定义了分布式事务处理模型,适用于多个资源管理器协调完成的复杂交易。

3.2 XA规范是什么

XA规范是分布式事务处理的标准,定义了三种角色和两个协议:

  • AP(应用程序):发起事务请求的应用程序。
  • RM(资源管理器):通常指数据库,负责管理资源并参与事务处理。
  • TM(事务管理器):协调和管理分布式事务,提供API接口。
  • XA协议:事务管理器与资源管理器之间的通信接口。
  • TX协议:应用程序与事务管理器之间的通信接口。

3.3 分布式事务的作用

在分布式环境中,一个全局事务需要协调多个资源(如数据库和消息队列)完成。只有所有操作成功,才能保证最终一致性,否则所有操作会回滚。这正是XA数据源的核心作用。

3.4 使用XA的场景

  • 需要将数据存储在多个数据库中,并保证所有操作的一致性。
  • 需要在一个事务中同时发送消息和更新数据库。
  • 希望在一个事务中将域信息存储在不同系统的数据库中。

四、如何使用分布式事务

4.1 J2EE分布式事务

Java事务编程接口(JTA)和Java事务服务(JTS)为J2EE平台提供了分布式事务支持。JTA通过XA规范实现分布式事务,JTS则规定了JTA中角色间的交互细节。

在J2EE中,分布式事务涉及事务管理器和支持XA协议的资源管理器。JTA提供了四个核心接口:

  • UserTransaction:开发人员操作的事务接口,用于控制事务流程。
  • TransactionManager:管理事务资源,作为UserTransaction和Transaction的桥梁。
  • Transaction:物理事务实例,关联到当前线程和XAResource。
  • XAResource:资源提供商实现的接口,支持XA事务操作。

使用JTA实现分布式事务的基本流程是:调用UserTransaction.begin()创建事务,关联到当前线程;然后通过Transaction和XAResource进行操作,最后调用commit或rollback。

4.2 使用J2EE分布式事务

  • 主流应用服务器如WebLogic、WebSphere和JBoss都提供JTA和XA支持。
  • Tomcat不自带JTA支持,需要依赖第三方框架如JOTM或Automikos。

五、总结

本文介绍了数据源和XA数据源的概念,分析了分布式事务的作用和应用场景,并阐述了J2EE如何通过JTA实现分布式事务。此外,还提到了柔性事务作为另一种分布式事务解决方案。

六、参考

作者:Karina Varela

翻译:小青菜

来源:本文由Spring4all技术翻译组完成

关注公众号:后端面试那些事儿

转载地址:http://gdyuz.baihongyu.com/

你可能感兴趣的文章
npm install 权限问题
查看>>
npm install报错,证书验证失败unable to get local issuer certificate
查看>>
npm install无法生成node_modules的解决方法
查看>>
npm install的--save和--save-dev使用说明
查看>>
npm node pm2相关问题
查看>>
npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
查看>>
npm run build报Cannot find module错误的解决方法
查看>>
npm run build部署到云服务器中的Nginx(图文配置)
查看>>
npm run dev 和npm dev、npm run start和npm start、npm run serve和npm serve等的区别
查看>>
npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
查看>>
npm scripts 使用指南
查看>>
npm should be run outside of the node repl, in your normal shell
查看>>
npm start运行了什么
查看>>
npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
查看>>
npm 下载依赖慢的解决方案(亲测有效)
查看>>
npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
查看>>
npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
查看>>
npm—小记
查看>>
npm上传自己的项目
查看>>
npm介绍以及常用命令
查看>>