WebSphere应用开发

2008-08-01 14:19:14.0     浏览:1310     来源:中国IT实验室
关键词:  WebSphere     应用开发  

3.2 使用WAS的JTA

Web应用程序在使用事务的时候常常会涉及一个事务类型的选择。是选择像JDBC事务这样的本地事务呢还是使用JTA支持的全局事务。这个与应用程序需要涉及到的事务管理器类型和个数密切相关。Spring本身不支持分布式事务,因此分布式事务需要底层的JTA。但是Spring提供了事务的抽象,即底层真正事务实现可以切换而不影响应用程序代码。这样应用程序可以依赖于底层WAS,也可以轻易地脱离开应用服务器的环境。这一点与前面数据源的抽象非常类似。

WAS本身对于事务划分有两种支持方式,一种是声明式的,当然这种管理方式需要EJB容器的支持,即所谓的容器管理事务(CMT)。另外一种方式是编程式的,通过程序代码来直接使用JTA编程接口。Spring对于事务的划分也可以分为声明式和编程式两种方式。对于Spring编程式的事务划分方式,总体上可以分为两大类。一类是通过直接使用实现PlatformTransactionManager接口的类。另一类是通过使用TransactionTemplate模板类,模板类的使用可以简化事务控制代码。Spring对于声明式事务划分的支持实际上是利用了它的AOP机制。相对于编程式事务划分,这种基于AOP的方式比较灵活,而且对代码的侵入性几乎为零。因此,如果没有特殊需要推荐使用这种事务划分方式。基于AOP的常用事务划分方式可以使用ProxyFactoryBean加TransactionInterceptor方式,或者使用TransactionPorxyFactoryBean的方式。前一种方式相对比较灵活,而后一种则对使用相对比较简单。

无论是哪一种事务划分方式,底层都需要一个事务管理机制作为支撑。如果是单一的事务资源管理器,那么根据所使用的后台事务管理资源不同的类型,可以选择的PlatformTransactionManager实现有DataSourceTransactionManager,HibernateTransactionManager, JdoTransactionManager, PersistenceBrokerTransactionManager,和JmsTransactionManager等。无论是单个还是多个事务资源管理器,都可以使用JtaTransactionManager类。如果使用JtaTransactionManager,那么所有事务管理实际都会委托给底层应用服务器的JTA实现。

例如,如果使用JDBC或iBATIS,那么我们可以使用简单的DataSourceTransactionManager,外部配置文件片断如下:

<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource"><ref local="dataSource" /></property></bean>


如果使用Hibernate,那么我们可以使用HibernateTransactionManager,外部配置文件片断如下:

<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"><property name="sessionFactory"><ref local="sessionFactory"/></property></bean>


使用WAS的JTA支持,我们只需要把上述对应bean中的class属性改成class属性改为org.springframework.transaction.jta.JtaTransactionManager,然后再把属性改为WebSphere对应的TransactionManager,参考如下:

<bean id="wasTxMgr"class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/><bean id="transactionManager"class="org.springframework.transaction.jta.JtaTransactionManager"><property name="transactionManager"><ref local="wasTxMgr"/></property></bean>


通过采用Spring的事务支持,底层事务采用何种方式的决定就不必在一开始开发就做出决定。因为我们能够通过Spring的外部配置文件来进行切换真正的事务支持。不过,虽然也有第三方的JTA支持,但是WAS能够提供非常稳定的XA支持,因此推荐使用WAS的JTA,尤其是当应用涉及到分布事务处理的时候。这样无论应用涉及几个事务资源都可以统一解决。