在其他事务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中将被剪枝)。
我建议使用XA事务,即使应用程序目前只访问一个资源(数据库)。原因如下:
1)将来,如果应用程序决定包括当前数据库以外的其他事务性资源,则会更容易找到,因为已经存在XA事务管理,并且多个事务性资源可以合并为单个事务。
2)由于您当前只有一个事务性资源,我认为使用XA与本地事务相比不会影响性能。原因是XA / JTA事务管理器已经针对单个事务性资源进行了某种优化(称之为一阶段优化)。
希望这有所帮助。
Nitin