博客
关于我
数据源面试三连杀:是啥?为什么要用?怎么用?
阅读量: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/

你可能感兴趣的文章
non linear processor
查看>>
Non-final field ‘code‘ in enum StateEnum‘
查看>>
none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
查看>>