Java 理论和实践: 理解 JTS[Java编程]
本文“Java 理论和实践: 理解 JTS[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
什么是 JTS?
JTS 是一个 组件事件监督器(component transaction monitor).这是什么意思?我们将介绍事件处理监督器(TPM)这个概念,TPM 是一个程序,它代表利用程序调和分布式事件的履行.TPM 与数据库呈现的时间长短差不多;在 60 年代后期,IBM 首先开辟了 CICS,至今人们仍在利用.经典的(大概说 程序化)TPM 管理被程序化定义为针对事件性资源(比方数据库)的操作序列的事件.随着分布式对象协议,如 CORBA、DCOM 和 RMI 的呈现,人们但愿看到事件更面向对象的前景.将事件性语义奉告面向对象的组件要求对 TPM 模子举行扩大 ― 在这个模子中事件是按照事件性对象的调用办法定义的.JTS 只是一个组件事件监督器(有时也称为 对象事件监督器(object transaction monitor)),或称为 CTM.
JTS 和 J2EE 的事件支持计划受 CORBA 对象事件服务(CORBA Object Transaction Service,OTS)的影响很大.实际上,JTS 实现 OTS 并充当 Java 事件 API(Java Transaction API)― 一种用来定义事件边界的初级 API ― 和 OTS 之间的接口.利用 OTS 替换成立一个新对象事件协议遵守了现有尺度,并使 J2EE 和 CORBA 可以彼此兼容.
乍一看,从程序化事件监督器到 CTM 的改变仿佛只是术语名称改变了一下.但是,差别不止这一点.当 CTM 中的事件提交或回滚时,与事件相关的对象所做的全部更改都一同被提交或撤消.但 CTM 怎么知道对象在事件期间做了什么事?象 EJB 组件之类的事件性组件并没有 commit() 或 rollback() 办法,它们也没向事件监督器注册自己做了什么事.那么 J2EE 组件履行的操作若何变成事件的一部份呢?
透明的资源征用
当利用程序状况被组件操作时,它仍旧存储在事件性资源管理器(比方,数据库和消息行列服务器)中,这些事件性资源管理器可以注册为分布式事件中的资源管理器.在第 1 部份中,我们谈论了如安在单个事件中征用多个资源管理器,事件管理器若何调和这些资源管理器.资源管理器知道若何把利用程序状况中的改变与特定的事件关联起来.
但这只是把问题的核心从组件转移到了资源管理器 ― 容器若何断定什么资源与该事件有关,可以供它征用?请考虑下面的代码,在典型的 EJB 会话 bean 中您大概会发现这样的代码:
清单 1. bean 管理的事件的透明资源征用
1 InitialContext ic = new InitialContext(); 2 UserTransaction ut = ejbContext.getUserTransaction(); 3 ut.begin(); 4 DataSource db1 = (DataSource) ic.lookup("java:comp/env/OrdersDB"); 5 DataSource db2 = (DataSource) ic.lookup("java:comp/env/InventoryDB"); 6 Connection con1 = db1.getConnection(); 7 Connection con2 = db2.getConnection(); 8 // perform updates to OrdersDB using connection con1 9 // perform updates to InventoryDB using connection con2 10 ut.commit(); 11 |
注意,这个示例中没有征用当前事件中 JDBC 衔接的代码 ― 容器会为我们完成这个任务.我们来看一下它是若何发生的.
资源管理器的三种范例
当一个 EJB 组件想拜候数据库、消息行列服务器大概别的一些事件性资源时,它需求到资源管理器的衔接(普通是利用 JNDI).并且,J2EE 标准只承认三种范例的事件性资源 ― JDBC 数据库、JMS 消息行列服务器和"别的通过 JCA 拜候的事件性服务".背面一种服务(比方 ERP 系统)必须通过 JCA(J2EE Connector Architecture,J2EE 衔接器体系构造)拜候.关于这些范例资源中的每一种,容器或供应者城市帮我们把资源征调到事件中.
在清单 1 中, con1 和 con2 好象是普通的 JDBC 衔接,比方那些从 DriverManager.getConnection() 返回的衔接.我们从一个 JDBC DataSource 得到这些衔接,JDBC DataSource 可以通过查找 JNDI 中的数据源名称得到.EJB 组件中被用来查找数据源( java:comp/env/OrdersDB )的名称是特定于组件的;组件的布置描写符的 resource-ref 部份将其映射为容器管理的一些利用程序级 DataSource 的 JNDI 名称.
躲藏的 JDBC 驱动器
每个 J2EE 容器都可以成立有事件意识的池态 DataSource 对象,但 J2EE 标准并不向您展示若何成立,因为这不在 J2EE 标准内.浏览 J2EE 文档时,您找不到任何干于若何成立 JDBC 数据源的内容.相反,您不得不为您的容器查阅该文档.成立一个数据源大概需求向属性或配置文件增添一个数据源定义,大概也可以通过 GUI 管理工具完成,这取决于您的容器.
每个容器(或衔接池管理器,如 PoolMan)都供应它自己的成立 DataSource 机制,JTA 魔术就躲藏在这个机制中.衔接池管理器从指定的 JDBC 驱动器得到一个 Connection ,但在将它返回到利用程序之前,将它与一个也实现 Connection 的虚包包在一同,将自己置入利用程序和底层衔接之间.当成立衔接大概履行 JDBC 操作时,包装器询问事件管理器当前线程是不是正在事件的上下文中履行,假如事件中有 Connection 的话,就自动征用它.
别的范例的事件性资源,JMS 消息行列和 JCA 衔接器,依靠类似的机制将资源征用躲藏起来,利用户看不到.假如要使 JMS 行列在布置时对 J2EE 利用程序可用,您就要再次利用特定于供应者的机制来成立受管 JMS 对象(行列衔接工厂和目标),然后在 JNDI 名称空间内公布这些对象.供应者成立的受管对象包含与 JDBC 包装器(由容器供应的衔接池管理器增添)类似的自动征用代码.
以上是“Java 理论和实践: 理解 JTS[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |