我正在开发一个部署在JBoss应用服务器上的J2EE应用程序。 该应用程序由EJB 2.x组件和Web组件组成,并在本地计算机或远程服务器上运行。该数据库是Oracle或SQL Server,不在分布式环境中。
我正在使用Hibernate 3.6(JPA 2.0实现)进行交易。我应该使用JTA这是容器管理的交易还是过度使用它?
目前我正在使用JTA,事实证明它运行正常但有一些小问题,我不知道它是否与事务管理有关。使用本地事务管理会更容易还是更可靠?
答案 0 :(得分:16)
总是建议在其他类型的事务API之上使用JTA事务,特别是如果您指的是仍然属于JPA API的本机事务。请注意,您不能说“JTA与资源本地事务”,因为JTA实际上管理资源本地事务等。
Gavin King(Hibernate的创建者)曾在一次采访中表示,这个特定于JPA的API是一个错误,应该首选更灵活的JTA API。特别是在使用声明式事务时,JTA非常轻量级。单词overkill
实际上将更多地应用于使用JPA本机事务API,然后使用JTA。
在使用XA或资源本地事务与JTA之间的选择方面有一些话要说。有关详细信息,请参阅我的回答:JTA or LOCAL transactions in JPA2+Hibernate 3.6.0?
我确实想知道为什么将EJB 2与JPA 2.0结合使用。 EJB 3.1在这里将是一个更合乎逻辑的选择。 EJB 2已完全弃用(将在Java EE 7中进行修剪)。
答案 1 :(得分:1)
我建议使用XA事务,即使应用程序当前只访问一个资源(数据库)。 Resons:
1)将来,如果应用程序决定在当前数据库之外包含一些其他事务资源,则会发现它更容易,因为XA事务管理已经到位,并且多个事务资源可以合并为一个事务。
2)由于您目前拥有单一的交易资源,我认为与本地交易相比,使用XA时性能不会受到影响。原因是XA / JTA事务管理器已经针对单个事务资源的情况进行了某种优化(他们称之为单阶段优化)。
希望有所帮助。
尼丁