数据源面试三连杀:是啥?为何要用?怎么用?

1、概述

在平常项目中确定须要用到数据源,那么数据源是什么,当遇到分布式事务的场景时数据源与非分布式事务场景的数据源又有什么不一样呢,在J2EE中分布式事务又是如何实现的呢,但愿本文能够解答您的疑惑。html

2、 数据源

2.1 数据源是什么

通俗来说,数据源是存储数据的地方。例如,数据库是数据源,其余系统也能够是数据源。在J2EE里,数据源是表明物理数据存储系统的实际Java对象。经过这些对象,J2EE应用能够获取到数据库的JDBC链接。java

2.2 数据源的设计

从UML图上能够看出,CommonDaraSource是对数据源概念的顶层抽象,约束了数据源必须实现的方法。数据源有三种类型的实现,分别是:面试

  • DataSource,基本实现,用于生成标准Connection对象
  • ConnectionPoolDataSource,链接池实现,这个数据源并不会直接建立数据库物理链接,而是一个逻辑实现,它的做用在于池化数据库物理链接。因为数据库物理链接是一个重量级的对象,频繁的建立销毁很影响性能,将物理链接池化后可下降建立和销毁的频率,复用链接以充分利用链接资源。
  • XAConnection,分布式事务实现,为支持分布式事务而诞生,这个数据源直接生产出的不是数据库物理链接Connection,而是一个支持XA的XAConnection对象,XAConnection对象能够直接生产数据库物理链接,同时生产XAResource用于支持XA事务,一般XAConnection对象生产出的数据库物理链接Connection须要和该XAConnection生产出的XAResource对象配合使用以完成XA事务处理。而且XAConnection继承PooledConnection,那就也具有链接池的实现。

3、为何须要XA数据源

3.1 XA数据源是什么

XA数据源指的是支持XA规范的数据源,支持分布式事务。spring

3.2 XA规范是什么

img

XA规范是一种分布式事务解决方案。X/OPEN组织定义的分布式事务处理模型(DTP),其包含3种角色和两个协议:sql

  • AP(Application,应用程序)
  • RM(Resources manager,资源管理器),一般指数据库
  • TM(Transaction manager,事务管理器),一般指事务协调者,负责协调和管理事务,提供给AP接口以及管理资源
  • XA协议是事务管理器与资源管理器之间的通讯接口
  • TX协议是应用程序与事务管理器之间的通讯接口

该模型中应用程序将一个全局事务传送到事务管理器,事务管理器将每一个全局事务分解为多个分支(分支事务),并将分支事务分配给单独的资源管理器进行服务,事务管理器经过XA接口将每一个分支事务与适当的资源管理器进行协调。数据库

3.3 分布式事务具有有什么样的做用?

若是仅在同一个事务上下文中须要协调多种资源(即数据库以及消息主题或队列等等),这个事务中的全部操做都必须成功,不然全部操做都将在失败的状况下回滚。这就是XA数据源的做用。编程

3.4 那什么样的场景须要使用XA?

  • 您的JavaEE应用程序必须使用单个事务将数据存储在两个数据库中
  • 您的应用程序须要经过单个事务发送JMS消息并将信息存储在数据库中
  • 您但愿使用PVP将您本身项目的域信息存储在一个不一样的数据库中,而这个数据库是被jBPM用来存储它本身的数据。

4、 那怎么使用分布式事务呢?

4.1 J2EE的分布式事务

Java事务编程接口(Java Transaction API,JTA)和Java事务服务(Java Transaction Service,JTS)为J2EE平台提供了分布式事务服务。后端

JTA事务是XA规范的Java实现,JTA事务有效的屏蔽了底层事务资源,使应用能够以透明的方式参与到事务处理中。分布式事务包括事务管理器和一个或多个支持XA协议的资源管理器。api

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等来实现。

5、总结

本文主要介绍了数据源和XA数据源,以及分布式事务基本原理、做用和场景以及如何使用J2EE分布式事务,但这种是属于基于资源层的底层分布式事务解决方案,在业内,用来解决分布式事务的方案还有柔性事务,柔性事务包括几种类型:两阶段型、补偿型、异步确保型和最大努力通知型,有兴趣能够更深刻的了解一下。

6、参考

做者 | Karina Varela · Jun
翻译 | 小青菜
来源 | https://dzone.com/articles/da... 本文有spring4all技术翻译组完成,更多国外前沿知识和干货好文,欢迎关注公众号:后端面试那些事儿。
相关文章
相关标签/搜索