4

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

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

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

4

7 回答 7

7

如何将提供连接资源和 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 知道,以便解决问题。

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

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

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

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

于 2009-05-09T09:10:12.990 回答
3

试试Atomikos TransactionsEssentials

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

最好的家伙

于 2009-05-30T15:12:47.680 回答
2

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

于 2009-05-08T16:38:20.457 回答
2

您可以使用 Spring,就像我不那么热衷一样。

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

于 2009-05-08T17:02:44.173 回答
2

JTA 支持本地事务全局事务

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

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

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

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

PS更正:​​JTA并不真正支持本地事务(正如人们指出的那样),但是当您只需要单个连接时,即使由 JTA 控制,也基本上是本地事务,尤其是当事务管理器位于相同的 JVM(因为它经常发生)。

于 2009-05-08T18:39:52.663 回答
2

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

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

于 2010-05-18T21:52:30.927 回答
1

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

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

无论如何,感谢所有人的有用答案!

于 2009-05-30T18:27:26.237 回答