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

你可能感兴趣的文章
Nginx访问控制_登陆权限的控制(http_auth_basic_module)
查看>>
nginx负载均衡器处理session共享的几种方法(转)
查看>>
nginx负载均衡的5种策略(转载)
查看>>
nginx负载均衡的五种算法
查看>>
Nginx运维与实战(二)-Https配置
查看>>
Nginx配置ssl实现https
查看>>
Nginx配置TCP代理指南
查看>>
Nginx配置——不记录指定文件类型日志
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
NHibernate学习[1]
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>