【问题标题】:What do I need to do to integrate JTA into a Java SE application?我需要做什么才能将 JTA 集成到 Java SE 应用程序中?
【发布时间】:2009-05-08 16:31:39
【问题描述】:

假设我想实现一个应用程序容器。不是完整的 Java EE 堆栈,但我需要提供对 JDBC 资源和事务的访问权限,以访问将部署在我正在编写的应用程序中的第三方代码。

进一步假设我正在查看 JBossTS 的事务。我还没有确定,但据我所知,它似乎最适合我需要做的事情。

如何将提供连接资源和 JTA 事务的支持集成到我的 Java SE 应用程序中?

【问题讨论】:

  • JBoss 的 TM 太可怕了。至少,如果您希望进行 ACID 事务。可以说的最好的一点是,只要它不必应对任何失败,它就可能不会搞砸。而且它并不孤单......大多数事务管理器(甚至一些商业管理器)真的不起作用。正如我在之前的回答中所说,您需要严格测试它们。 stackoverflow.com/questions/777636/…
  • 如果情况如此糟糕,我将不得不考虑替代方案。当我试图弄清楚如何使用它时,Bitronix 把我弄糊涂了,所以......好吧,所以这个问题。
  • @erickson,如果你要发表 JBossTM 之类的声明太可怕了 - 至少要给出一些理由。
  • 我做到了:它并不总是从分布式事务期间的故障中完全恢复。

标签: jndi jta java


【解决方案1】:

如何集成对 提供连接资源和 JTA 事务到我的 J2SE 应用程序?

你好克里斯

这个问题有两个要素:

1) 使 JTA API(主要是 UserTransaction)可用于应用程序代码,因此它可以启动和结束事务。在 Java EE 环境中,它被发布到 JNDI 中一个众所周知的位置。如果你有一个 JNDI 实现,那就是你要走的路(使用 JBossTS 的 JNDIManager 类来帮助你进行设置)。否则,您需要某种工厂对象或注入机制。当然,您也可以将实现类直接暴露给最终用户,但这有点讨厌,因为它限制了将来更换 JTA 的任何机会。

public javax.transaction.UserTransaction getUserTransaction() {
  return new com.arjuna.ats.internal.jta.transaction.UserTransactionImple();
}

就是这样——您现在可以开始、提交和回滚事务了。一些容器也以类似的方式将 TransactionManager 类发布到应用程序,但它实际上是为容器本身设计的,应用程序代码很少需要它。

2) 自动管理 XAResources 的登记。资源管理器,即数据库和消息队列,具有实现 XAResource 的驱动程序。每次应用程序获得与资源管理器的连接时,都需要将相应的 XAResource 移交给 JTA 实现,以便它可以驱动资源管理器作为 2PC 的一部分。大多数应用程序服务器都带有自动处理此问题的 JCA。在没有它的环境中,您需要一些替代方法来使应用程序代码免于手动完成这项繁琐的任务。与 JBossTS 捆绑的 TransactionalDriver 为 JDBC 连接处理这个问题。 XAPool 可能也值得考虑。

多年来,JBossTS 已嵌入到许多环境中。一些经验教训记录在集成指南http://anonsvn.jboss.org/repos/labs/labs/jbosstm/trunk/atsintegration/docs/] 中,如果您想要一个工作示例,您可以查看 tomcat 集成工作http://anonsvn.jboss.org/repos/labs/labs/jbosstm/workspace/jhalliday/tomcat-integration/]

JBoss 的 TM 太可怕了。至少,如果 您希望进行 ACID 交易。

你好埃里克森

我不认为我会走到“可怕”的地步。它的功能非常强大且高度可配置,这会让新手感到有些畏惧的开箱即用体验。正确的恢复配置特别棘手,因此我完全赞同您关于严格测试的评论。除此之外,我不知道有任何记录在案的测试用例在与符合规范的资源管理器一起使用时无法提供 ACID 结果。如果您有这样的案例,或者只是更有建设性的改进建议,请让 JBoss 知道,以便问题得到解决。

不要重新发明轮子。使用 春天框架。它已经提供 此功能等等。

-1 Spring 不提供 JTA 实现,只是对各种 3rd 方的封装。这是一个常见的误解。

JTA 支持本地事务和 全局事务。

恐怕又是一个误解。 JTA 规范仅处理 XA,即全局事务。存在各种众所周知的技术来使 JTA 事务管理器驱动本地事务。这些通常涉及将连接包装在 XAResource 中。虽然大多数实现都支持这一点,但它实际上超出了规范的范围,因此如果您需要此行为,则必须在选择 JTA 实现之前与供应商确认。

【讨论】:

  • 你说得对,JTA 仅适用于 XA。然而,有些人将它用于单个连接,在这种情况下,它与本地事务几乎没有什么不同。对不起,草率的解释。
【解决方案2】:

试试Atomikos TransactionsEssentials

与竞争的开源 JTA/XA 实现不同,这个实现是从一开始就为 JSE 编写的。因此,它提供了高级 JDBC 和 JMS 池以及 JTA/XA 功能,您会发现它非常容易集成到您的应用程序中。

最好的 伙计

【讨论】:

    【解决方案3】:

    不要重新发明轮子。使用Spring Framework。它已经提供了这个功能等等。

    【讨论】:

    • 埃里克森,你成功了。 Spring 携带的编程模型不适用于我想做的事情。
    • 好吧,你可以简单地使用你想要的功能而忽略其余的,但如果你不能使用 DI 风格的编程模型,我同意使用它没有多大意义。除非您从事的是业务,否则构建一个类似的框架似乎是在浪费精力。
    【解决方案4】:

    你可以使用 Spring,虽然我不是很热衷。

    你可能想要的一个例子是here

    【讨论】:

    • Spring 没有提供 TransactionManager 它只有一个 Transactions 的抽象。
    【解决方案5】:

    JTA 支持本地事务全局事务

    本地事务可以通过 Spring、JPA 甚至手动提交连接轻松处理。

    全球事务需要事务协调员。这是一个单独的产品/库,在开源中不容易获得(或者至少我不知道)。

    所以,如果我查看您帖子的标题(“JTA”),答案是 NO SIMPLE WAY

    如果我阅读您的帖子本身(“提供对 JDBC 资源和事务的访问”),我会说 Spring、JPA 和 Hibernate 都可以满足您的需求(据我了解)。

    附: 更正:JTA 并不真正支持本地事务(正如人们指出的那样),但是当您只需要一个连接时,基本上是本地事务,即使如果由 JTA 控制,尤其是当事务管理器位于同一个 JVM 中时(这种情况经常发生)。

    【讨论】:

      【解决方案6】:

      “JBoss 的 TM 太可怕了。至少,如果您希望进行 ACID 事务。人们可以说的最好的一点是,只要它不必应对任何故障,它就可能不会搞砸。而且它并不孤单……大多数事务管理器(甚至一些商业管理器)确实不起作用。”

      不确定您为做出上述陈述做了哪些功课,但 JBossTS(自 2006 年以来 JBoss 中的 TM,当它被收购时)确实提供了完整的 ACID 语义。它最初也是 HP NetAction 套件的一部分,与其他任何开源 TM 相比,它被部署在更多关键任务应用程序中。

      【讨论】:

      • +1 我一直听说有关 ArjunaTS 的好消息(对于那些感兴趣的人,TSS 上有一个很好的 thread)。
      【解决方案7】:

      我已选择使用 Bitronix 事务管理器来解决这个问题,尽管显然至少还有一个当时我不明白的其他选项 (Atomikos)。

      解决这个问题最终还需要我使用 Tomcat 进程内 JNDI 提供程序,以便将事务与 JNDI 名称相关联。由于该提供程序的限制,我无法为 JTA UserTransaction 使用默认名称,这在文档中并未立即显现。

      无论如何,感谢大家提供有用的答案!

      【讨论】:

        猜你喜欢
        • 2011-11-15
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        相关资源
        最近更新 更多