假设我想实现一个应用程序容器.不是完整的Java EE堆栈,但我需要提供对第三方代码的JDBC资源和事务的访问权限,这些代码将部署在我正在编写的应用程序中.
进一步假设我正在研究JBossTS的交易.我并不满足于此,但据我所知,它似乎最适合我需要做的事情.
如何集成对我的Java SE应用程序中提供连接资源和JTA事务的支持?
小智 7
如何集成对我的J2SE应用程序中提供连接资源和JTA事务的支持?
嗨克里斯
这个问题有两个要素:
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();
}
Run Code Online (Sandbox Code Playgroud)
就是这样 - 你现在可以开始,提交和回滚交易了.一些容器也以类似的方式将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 Framework.它已经提供了这种功能以及更多功能.
-1 Spring不提供JTA实现,只是各种第三方实现的包装器.这是一种常见的误解.
JTA支持本地事务和全局事务.
我害怕另一种误解.JTA规范仅涉及XA即全球交易.存在各种众所周知的技术用于使JTA事务管理器驱动本地事务.这些通常涉及将Connection包装在XAResource中.虽然大多数实现都支持这一点,但它实际上超出了规范的范围,因此如果您需要此行为,则必须在选择JTA实现之前与供应商核实.
| 归档时间: |
|
| 查看次数: |
5481 次 |
| 最近记录: |