Java JTA或JPA2和x2B中的本地交易;Hibernate3.6.0?

Java JTA或JPA2和x2B中的本地交易;Hibernate3.6.0?,java,jpa,jpa-2.0,jta,Java,Jpa,Jpa 2.0,Jta,我们正在重新思考我们的技术堆栈,下面是我们的选择(由于应用程序的复杂性等原因,我们不能没有Spring和Hibernate)。我们还将从J2EE1.4迁移到JavaEE5 技术栈 Java EE 5 JPA2.0(我知道JavaEE5只支持 JPA1.0,但我们想使用Hibernate (作为JPA提供商) Hibernate 3.6.0(我们已经有了 大量具有自定义类型的hbm文件 所以我们不想迁移 这意味着 我们希望jpa/hbm映射都能工作 一起冬眠,因此冬眠成为可能 JPA提供程序,而不

我们正在重新思考我们的技术堆栈,下面是我们的选择(由于应用程序的复杂性等原因,我们不能没有Spring和Hibernate)。我们还将从J2EE1.4迁移到JavaEE5

技术栈

  • Java EE 5
  • JPA2.0(我知道JavaEE5只支持 JPA1.0,但我们想使用Hibernate (作为JPA提供商)
  • Hibernate 3.6.0(我们已经有了 大量具有自定义类型的hbm文件 所以我们不想迁移 这意味着 我们希望jpa/hbm映射都能工作 一起冬眠,因此冬眠成为可能 JPA提供程序,而不是使用 应用程序附带的默认设置 服务器)
  • 现在的问题是,我希望坚持使用本地事务,但其他团队成员希望使用JTA。在过去的9年中,我一直在使用J2EE,并且我多次听到人们建议如果我不需要两阶段提交,就坚持使用本地事务。这不仅是出于性能原因,而且调试/排除本地事务比JTA容易得多(即使JTA只在需要时进行单阶段提交)


    我的建议是使用spring声明性事务管理+本地事务(HibernateTransactionManager)而不是容器JTA


    我想确定我是偏执狂还是有正确的观点。我想听听JavaEE世界其他人的想法。或者请给我一篇合适的文章。

    JTA并不意味着两阶段提交。我认为是JTA和XA驱动程序的组合使得两阶段提交成为可能

    我仍然建议使用JTA和声明性事务,而不是在代码中嵌入事务逻辑。事务最好以面向方面的方式完成,即la-Spring

    更新:


    根据你发布的附加信息,我同意你的论点。我建议使用Spring声明性事务和类

    正如Duffy已经提到的,JTA不是2阶段提交的同义词,2阶段提交是通过XA协议完成的

    例如,在JBoss中,您可以显式地选择给定的数据源是xa数据源还是tx数据源。在这两种情况下,交易都通过JTA进行管理

    在某些情况下,您可能已经在不知不觉中使用了JTA。如果以事务方式发送JMS消息,或者在修改数据库中某些内容的同一事务中更新事务缓存,则事务管理器会自动切换到XA模式。表示数据库的数据源可能不是XA,但在XA事务中,允许1资源为非XA。然后通过上次资源提交优化对该资源进行更新

    虽然你应该经常为自己计算风险和测试,但我还是想提醒你不要无端的恐惧。XA似乎是我们作为开发人员所害怕的东西之一。最近在JBoss论坛上有一个有趣的讨论:

    问题是,XA在过去可能是一种复杂的技术,其实现低于标准,但在这个FUD之后的近15年中,情况可能不再如此。1995年的复杂大企业技术是2011年的常规技术


    这与我们曾经对EJB产生的恐惧相比,EJB现在已经完全不相关了,或者对虚拟机的恐惧(对于Java程序员来说显然不是问题),或者当您真正参与这个行业很长一段时间时,对做函数调用这样基本的事情的恐惧;)

    对。Idea使用spring进行事务处理。我理解JTA实际上并不意味着2阶段,但我的观点是,如果我们已经知道我们不想要2阶段,那么为什么要选择JTA?我的建议是使用spring声明性事务管理+本地事务如果我使用本地事务,那么我就不需要在spring中定义“org.springframework.transaction.JTA.JtaTransactionManager”bean。我只是将“HibernateTransactionManager”或“JpaTransactionManager”定义为thanx。我越来越难说服他们接受我的方法。他们说我提出的两点(性能和难以调试)太抽象了,我没有足够的数据来证明这一点。您能想到使用JTA的其他不利之处吗?或者使用本地trans和spring声明性trans的好处吗。他们还建议使用EJB3和CMT,我想看看他们的数据来证明他们的观点。我敢打赌你们两个都没有任何数据。他们在为EJB3和CMT辩护,并直面地批评Spring?请可以归结为Spring或EJB3.1首选项。对你来说,好消息是其中任何一个都会起作用。当然,我更喜欢春天。您可以通过按照接口编写所有内容来推迟选择。您可以在不影响客户端的情况下切换实现。您写道:“表示数据库的数据源可能不是XA,但在XA事务中,1资源可以是非XA的。”在这种情况下,为什么允许非XA?事实上,在事务提交后,对于结果的全局性,它不能倾向于不犹豫的行为吗?例如,如果这个非XA资源不能支持两阶段提交,我们如何确保全局事务(针对多个数据源)正常进行?@Mik378请参阅我的
    上次资源提交优化的概念。如果轮到最后一个资源提交,那么您知道一件您之前不知道的事情:所有其他资源都可以提交。因此,它只取决于最后一个资源是否可以提交完整的TX,这很简单。如果它indeeds commit,则整个TX被提交(意味着其他人,已经表示他们可以提交),如果它不提交(例如抛出),则其他人被回滚。我不知道“最后一次资源提交”的概念。现在我明白了