如何集成对
提供连接资源和 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 实现之前与供应商确认。