在日常项目中肯定需要用到数据源,那么数据源是什么,当遇到分布式事务的场景时数据源与非分布式事务场景的数据源又有什么不同呢,在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接口之间的桥梁。