9.8. 与特定应用服务器集成

一般来说,Spring的事务抽象与应用服务器是无关的。此外,使用Spring的 JtaTransactionManager 类时, 一种可选的方式是通过JNDI查询获得JTA UserTransactionTransactionManager 对象, 其中后者可以被设置为自动探测,这时针对不同的应用服务器有不同的方式。能够直接访问 TransactionManager, 确实在很大程度上增强了事务语义,可以参考 JtaTransactionManager 类的javadoc获得更多细节。

当在J2EE应用服务器上运行时,Spring的JtaTransactionManager是一个标准的选择,它在已知的所有通用服务器上都能正常工作。 它的一些诸如事务挂起等高级功能也可以在无须特殊配置的情况下在已知的许多服务器上工作(包括 GlassFish、JBoss、Geronimo和Oracle OC4J), 然而,为了完全支持事务挂起等高级功能,Spring为IBM WebSphere 、BEA WebLogic以及Oracle OC4J提供了特殊支持。我们会在后面的章节中讨论这个话题.

在标准的场景中,包括 WebLogic、WebSphere和OC4J,请考虑简单的使用'<tx:jta-transaction-manager/>'配置元素。 它会自动检测底层所使用的服务器以此来选择最合适的事务管理器。 这意味着你不需要显式的为服务器配置特殊的适配器(就像在后面的部分讨论的那样),选择会自动完成, 并且如果找不到的话会启用标准的 JtaTransactionManager来管理。

9.8.1. IBM WebSphere

在WebSphere 6.0以及后续版本中,推荐使用的Spring JTA 事务管理器是WebSphereUowTransactionManager。 这个适配器充分利用了WebSphere应用服务器 (6.0.2.19 以及更高的版本和6.1.0.9以及更高的版本)中提供的 UOWManager API。 通过使用这个适配器,Spring驱动的事务挂起(PROPAGATION_REQUIRES_NEW发起的挂起/恢复)得到了IBM的官方支持。

在WebSphere 5.1环境下,你可以使用Spring的 WebSphereTransactionManagerFactoryBean 类。 这是一个工厂类,通过WebSphere的 静态 访问方法获取到JTA TransactionManager 实例。 一旦通过工厂bean获取到JTA TransactionManager 实例, 就可以使用该实例装配一个Spring的 JtaTransactionManager bean, 它封装了JTA UserTransaction,提供增强的事务语义。请参考相关javadoc以获得完整信息。

请注意WebSphereTransactionManagerFactoryBean虽然可以在WAS 5.1和6.0上正常工作,但是并没有得到官方的正式支持。 如果需要运行在WAS6.0或者更高的版本上,请参考上面的WebSphereUowTransactionManager部分。

9.8.2. BEA WebLogic

在一个使用WebLogic 8.1或更高版本的环境中,你一般会优先选用特定于WebLogic的 WebLogicJtaTransactionManager 类。 来取代JtaTransactionManager 类。在WebLogic环境中,该类提供了对Spring事务定义的完全支持,超过了标准的JTA语义。 它的特性包括:支持事务名,支持为每个事务定义隔离级别,以及在任何环境下正确地恢复事务的能力。

9.8.3. Oracle OC4J

Spring为OC4J 10.1.3以及更高的版本提供了一个特殊的适配器: OC4JJtaTransactionManager。这个适配器跟前面的WebLogicJtaTransactionManager很类似, 在OC4J上提供类似的辅助功能:事务名称和针对每个事务不同的独立等级。

请注意所有的 JTA 功能,包括事务挂起,都可以很好的通过Spring的 JtaTransactionManager在 OC4J 工作。 特殊的OC4JJtaTransactionManager提供了比标准JTA更多的超值功能。