要将JTA集成到Java SE应用程序中,我需要做什么?

时间:2009-05-08 16:31:39

标签: jndi jta java

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

进一步假设我正在查看JBossTS的事务。我并不满足于此,但据我所知,它似乎最适合我需要做的事情。

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

7 个答案:

答案 0 :(得分: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实现,只是各种第三方实现的包装器。这是一种常见的误解。

  

JTA支持本地交易和   全球交易。

我害怕另一种误解。 JTA规范仅涉及XA即全球交易。存在各种众所周知的技术用于使JTA事务管理器驱动本地事务。这些通常涉及将Connection包装在XAResource中。虽然大多数实现支持这一点,但它实际上超出了规范的范围,因此如果您需要此行为,则必须在选择JTA实现之前与供应商核实。

答案 1 :(得分:3)

试试Atomikos TransactionsEssentials

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

最佳

答案 2 :(得分:2)

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

答案 3 :(得分:2)

你可以使用Spring,就像我不那么热衷。

您可能需要的示例是here

答案 4 :(得分:2)

JTA支持本地交易全局交易

Spring,JPA甚至连接上的手动提交都可以轻松处理本地事务。

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

所以,如果我查看帖子的标题(“JTA”),答案是没有简单的方法

如果我自己阅读你的帖子(“提供对JDBC资源和事务的访问”),我会说 Spring,JPA和Hibernate都会满足你的需求(正如我所理解的那样)。 / p>

P.S。 更正:JTA 不支持真正支持本地事务(正如人们指出的那样),但是只需要一个连接的情况本质上就是本地事务,甚至如果由JTA控制,尤其是当事务管理器位于同一个JVM中时(通常会发生)。

答案 5 :(得分:2)

“JBoss的TM非常糟糕。至少,如果你希望进行ACID交易。人们可以说的最好的是,只要它不必与任何失败抗争,它就不会搞砸了。而且并不孤单......大多数交易经理(甚至是一些商业交易经理)确实无法运作。“

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

答案 6 :(得分:1)

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

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

感谢所有人提供有用的答案!