是否使用JTA事务?

7
我正在开发一个J2EE应用程序,它部署在JBoss应用服务器上。该应用程序由EJB 2.x组件和Web组件组成,并在本地计算机或远程服务器上运行。数据库可以是Oracle或SQL Server,但不处于分布式环境中。 我正在使用Hibernate 3.6(JPA 2.0实现)进行事务处理。我应该使用容器管理的JTA事务吗?还是使用它有些过度了? 目前,我正在使用JTA,据说运行良好,但似乎存在一些小问题,我不确定这是否与事务管理有关。使用本地事务管理更容易或更可靠吗?

感谢您的评论。如果我同时使用EJB 2.x和JPA,那么我应该使用哪个事务管理器?对于Spring-Roo应用程序,默认值为org.springframework.orm.jpa.JpaTransactionManager,但我想我应该使用其他东西。 - newguy
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
17

在其他事务API中,特别是当涉及到仍然是JPA API的本地事务时,始终建议使用JTA事务。请注意,您不能说“JTA vs资源本地事务”,因为JTA实际上管理着其他类型的资源本地事务。

Gavin King(Hibernate的创建者)曾在一次采访中表示,这个JPA特定的API是一个错误,并且应该优先使用更加灵活的JTA API。特别是在使用声明性事务时,JTA非常轻量级。使用JPA原生事务API相对于使用JTA来说过度强大。

关于使用JTA选择XA或本地资源事务,有些事情需要说。请参阅我的答案,了解更多详情: JPA2 + Hibernate 3.6.0中的JTA或LOCAL事务?

我想知道为什么您要将EJB 2与JPA 2.0结合使用。在这里,EJB 3.1会是一个更加合理的选择。 EJB 2已完全被弃用(在Java EE 7中将被剪枝)。


谢谢你,Arjan。我目前处于项目迁移阶段,因此我需要同时运行EJB 2和JPA 2,以便能够测试更改不会影响我的项目原有的行为。最终,我的项目将完全迁移到JPA 2。 - newguy
不用谢。请注意,最强大的组合是EJB 3.1 + JPA 2。这两者互相补充,非常出色。 - Arjan Tijms

1

我建议使用XA事务,即使应用程序目前只访问一个资源(数据库)。原因如下:

1)将来,如果应用程序决定包括当前数据库以外的其他事务性资源,则会更容易找到,因为已经存在XA事务管理,并且多个事务性资源可以合并为单个事务。

2)由于您当前只有一个事务性资源,我认为使用XA与本地事务相比不会影响性能。原因是XA / JTA事务管理器已经针对单个事务性资源进行了某种优化(称之为一阶段优化)。

希望这有所帮助。

Nitin


2
永远不要根据推测性的需求构建东西。如果确实有明确的需要,那就使用它。不要因为你“可能”需要它而去做。 - geoaxis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,