假设我想实现一个应用程序容器。不是一个完整的Java堆栈,但我需要向第三方代码提供对JDBC资源和事务的访问,这些代码将部署在我正在编写的应用程序中。
此外,假设我正在查看JBossTS中的事务。我还没有决定,但据我所知,这似乎是最适合我需要做的事情。
如何将提供连接资源和JTA事务的支持集成到我的Java应用程序中?
发布于 2009-05-30 18:27:26
我选择使用Bitronix事务管理器来解决这个问题,尽管显然当时至少还有一个选项(Atomikos)对我来说并不明显。
解决这个问题需要我也使用Tomcat在进程中的JNDI提供程序,以便将事务与JNDI名称关联起来。由于该提供程序的限制,我无法使用JTA UserTransaction的默认名称,这在文档中并不明显。
感谢所有的帮助的答案无论如何!
发布于 2009-05-09 09:10:12
如何将对提供连接资源和JTA事务的支持集成到我的J2SE应用程序中?
嗨,克里斯
这个问题有两个要素:
1)使JTA (主要是UserTransaction )可用于应用程序代码,从而可以启动和结束事务。在Java环境中,它被发布到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。在没有应用程序的环境中,您需要一些替代方法来节省应用程序代码,使其不必手工完成这项繁琐的任务。与TransactionalDriver捆绑在一起的JBossTS为JBossTS处理这个问题。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/ ]。
乔博斯的TM太可怕了。至少,如果您希望进行ACID交易。
你好埃里克森
我不认为我会像“可怕”那样。它是难以置信的强大和高度可配置的,这可以使开箱即用的体验有点令新手望而却步。正确的恢复配置特别棘手,所以我完全赞同您对严格测试的评论。除此之外,我不知道有任何文档化的测试用例,在这些测试用例中,当与符合规范的资源管理器一起使用时,它目前无法提供ACID结果。如果您有这样的案例,或者只是更有建设性的改进建议,请让JBoss知道这样问题才能得到解决。
别再发明轮子了。使用Spring框架。它已经提供了这个功能以及更多的功能。
-1 Spring不提供JTA实现,只提供各种第三方实现的包装器。这是一个常见的误解。
JTA支持本地事务和全局事务。
恐怕是另一种误解。JTA规范只处理XA,即全局事务。使用各种众所周知的技术来使JTA事务管理器驱动本地事务。这通常涉及将连接包装在XAResource中。虽然大多数实现都支持这一点,但实际上它超出了规范的范围,因此如果需要这种行为,您必须在选择JTA实现之前与供应商进行检查。
发布于 2009-05-30 15:12:47
试试Atomikos TransactionsEssentials。
与竞争的开源JTA/XA实现不同,这个实现是从JSE开始编写的。因此,它提供优质的JDBC和JMS池以及JTA/XA功能,您将发现很容易将其集成到应用程序中。
最佳男
https://stackoverflow.com/questions/840694
复制相似问题