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

你可能感兴趣的文章
Python NLP自然语言处理详解
查看>>
python nltk nltk_data 离线安装,chatterbot
查看>>
Redis 限流的 3 种方式,还有谁不会?
查看>>
Python这么慢,为啥大公司还在用?
查看>>
python note 06 编码方式
查看>>
python numba 转灰度图_使用NumPy、Numba的简单使用(二)
查看>>
Python Numpy 关于 linspace()函数 使用详解(全)
查看>>
Python numpy插入、读取至postgreSQL数据库中bytea类型字段
查看>>
Python numpy数据的保存和读取
查看>>
python numpy矩阵索引_python – 在2D numpy ndarray或numpy矩阵中获取前N个值的索引
查看>>
Python OCR库:自动化测试验证码识别神器!
查看>>
python opencv - 斑点检测或圆形检测
查看>>
Python还可以做情感分析你不看看吗?
查看>>
Python OpenCV HoughLinesP 无法检测线
查看>>
Python OpenCV-使用透明度覆盖图像
查看>>
python Opencv图像基础操作
查看>>
Python OpenCV将图像转换为字节字符串?
查看>>
python OpenCV视频的读取及保存
查看>>
python open和file的区别
查看>>
python open读取文件并对换行进行处理
查看>>