一、概述
在日常我的项目中必定须要用到数据源,那么数据源是什么,当遇到分布式事务的场景时数据源与非分布式事务场景的数据源又有什么不同呢,在J2EE中分布式事务又是如何实现的呢,心愿本文能够解答您的纳闷。
二、 数据源
2.1 数据源是什么
艰深来讲,数据源是存储数据的中央。例如,数据库是数据源,其余零碎也能够是数据源。在J2EE里,数据源是代表物理数据存储系统的理论Java对象。通过这些对象,J2EE利用能够获取到数据库的JDBC连贯。
2.2 数据源的设计
从UML图上能够看出,CommonDaraSource是对数据源概念的顶层形象,束缚了数据源必须实现的办法。数据源有三种类型的实现,别离是:
- DataSource,根本实现,用于生成规范Connection对象
- ConnectionPoolDataSource,连接池实现,这个数据源并不会间接创立数据库物理连贯,而是一个逻辑实现,它的作用在于池化数据库物理连贯。因为数据库物理连贯是一个重量级的对象,频繁的创立销毁很影响性能,将物理连接池化后可升高创立和销毁的频率,复用连贯以充分利用连贯资源。
- XAConnection,分布式事务实现,为反对分布式事务而诞生,这个数据源间接生产出的不是数据库物理连贯Connection,而是一个反对XA的XAConnection对象,XAConnection对象能够间接生产数据库物理连贯,同时生产XAResource用于反对XA事务,通常XAConnection对象生产出的数据库物理连贯Connection须要和该XAConnection生产出的XAResource对象配合应用以实现XA事务处理。并且XAConnection继承PooledConnection,那就也具备连接池的实现。
三、为什么须要XA数据源
3.1 XA数据源是什么
XA数据源指的是反对XA标准的数据源,反对分布式事务。
3.2 XA标准是什么
XA标准是一种分布式事务解决方案。X/OPEN组织定义的分布式事务处理模型(DTP),其蕴含3种角色和两个协定:
- AP(Application,应用程序)
- RM(Resources manager,资源管理器),通常指数据库
- TM(Transaction manager,事务管理器),通常指事务协调者,负责协调和治理事务,提供给AP接口以及治理资源
- XA协定是事务管理器与资源管理器之间的通信接口
- TX协定是应用程序与事务管理器之间的通信接口
该模型中应用程序将一个全局事务传送到事务管理器,事务管理器将每个全局事务合成为多个分支(分支事务),并将分支事务调配给独自的资源管理器进行服务,事务管理器通过XA接口将每个分支事务与适当的资源管理器进行协调。
3.3 分布式事务具备有什么样的作用?
如果仅在同一个事务上下文中须要协调多种资源(即数据库以及音讯主题或队列等等),这个事务中的所有操作都必须胜利,否则所有操作都将在失败的状况下回滚。这就是XA数据源的作用。
3.4 那什么样的场景须要应用XA?
- 您的JavaEE应用程序必须应用单个事务将数据存储在两个数据库中
- 您的应用程序须要通过单个事务发送JMS音讯并将信息存储在数据库中
- 您心愿应用PVP将您本人我的项目的域信息存储在一个不同的数据库中,而这个数据库是被jBPM用来存储它本人的数据。
四、 那怎么应用分布式事务呢?
4.1 J2EE的分布式事务
Java事务编程接口(Java Transaction API,JTA)和Java事务服务(Java Transaction Service,JTS)为J2EE平台提供了分布式事务服务。
JTA事务是XA标准的Java实现,JTA事务无效的屏蔽了底层事务资源,使利用能够以通明的形式参加到事务处理中。分布式事务包含事务管理器和一个或多个反对XA协定的资源管理器。
JTA是面向利用或应用服务器与资源管理器的高层事务接口。
JTS是一组约定JTA中角色之间交互细节的标准。
JTA提供了以下四个接口
- javax.transaction.UserTransaction,是面向开发人员的接口,可能编程地管制事务处理。UserTransaction.begin办法开启一个全局事务,并且将该事务与调用线程关联起来。
- javax.transaction.TransactionManager,容许应用程序服务器来管制代表正在治理的应用程序的事务。它自身并不承当理论的事务处理性能,它更多的是充当UserTransaction接口和Transaction接口之间的桥梁。
- javax.transaction.Transaction,代表了一个物理意义上的事务,在开发人员调用UserTransaction.begin()办法时TransactionManager会创立一个Transaction事务对象,
- javax.transaction.xa.XAResource,面向提供商的实现接口,是一个基于X/Open CAE Specification的行业标准XA接口的Java映射。提供商在提供拜访本人资源的驱动时,必须实现这样的接口。
开发者调用UserTransaction.begin办法时,因为UserTransaction的实现类持有TransactionManager,TransactionManager充当UserTransaction和Transaction之间的桥梁,所以在调用UserTransaction的begin办法时,TransactionManager会创立Transaction事务对象,并把此对象通过ThreadLocal关联到以后线程。当调用UserTransaction其余办法时,会从以后线程取出事务对象Transaction对象,并通过Transaction对象找到与其关联的XAResource对象,而后进行commit、rollback等操作。其根本流程如以下代码:
// 创立一个Transaction,挂到以后线程上UserTransaction userTx = null; Connection connA = null; Connection connB = null; try{ userTx.begin(); // 将Connection对应的XAResource挂到以后线程对应的Transaction connA.exec("xxx") connB.exec("xxx") // 找到Transaction关联的XAResource,让它们都提交 userTx.commit();}catch(){ // 找到Transaction关联的XAResource,让它们都回滚 userTx.rollback();}
4.2 如何应用J2EE的分布式事务
- WebLogic、Websphere、JBoss等支流的应用服务器提供了JTA的实现和反对。
- Tomcat中没有提供JTA的实现的,这就须要借助第三方的框架Jotm、Automikos等来实现。
五、总结
本文次要介绍了数据源和XA数据源,以及分布式事务基本原理、作用和场景以及如何应用J2EE分布式事务,但这种是属于基于资源层的底层分布式事务解决方案,在业内,用来解决分布式事务的计划还有柔性事务,柔性事务包含几种类型:两阶段型、弥补型、异步确保型和最大致力告诉型,有趣味能够更深刻的理解一下。
六、参考
- https://dzone.com/articles/da...
- https://searchoracle.techtarg...
- https://docs.oracle.com/datab...
- https://docs.oracle.com/javas...
- https://blog.csdn.net/conquer...
- https://www.ibm.com/developer...
- https://www.dazhuanlan.com/20...
作者 | Karina Varela · Jun
翻译 | 小青菜
起源 | https://dzone.com/articles/da...
本文有spring4all技术翻译组实现,更多国外前沿常识和干货好文,欢送关注公众号:后端面试那些事儿。