我想通过使用一个微框架编写我的下一个小型Java webapp。例如。 Spark或Jooby。问题是它们都不支持JTA,所以我需要使用第三方库之一。我已经开始搜索开源JTA实现,并找到了两个:Atomikos和Bitronix。似乎后一个项目略有放弃,所以我决定选择Atomikos。不幸的是,文档很少,所以我无法找到问题的答案。
这是用例。假设我们有两个DAO类,哪些方法应该在单个事务下执行:
class SomeService {
// both injected by Guice
private FooDao fooDao;
private BarDao barDao;
public void someMethod() {
// both methods should be executed in a single transaction
fooDao.insert(new Foo());
barDao.insert(new Bar());
}
}
我之前没有直接/手动使用javax.transaction
API(你知道Spring的声明性事务非常简单)所以我有点困惑。 JTA提供了两个通用抽象(UserTransaction
和TransactionManager
),它们都有处理JDBC事务的方法。据我所知,TransactionManager通过使用ThreadLocal变量来操作UserTransaction对象。因此,UserTransaction应该是线程限制的,并且TransactionManager应该是线程安全的。我是对的吗?
所以有几种可能的方法:
哪个是正确/最佳实践?
另一个问题是,熟悉Atomikos的人是否提供了两个事务管理器实现(可能更多):J2eeTransactionManager和UserTransactionManager。文档再次缺乏,所以除了JNDI之外,我没有看到任何差异。我想UserTransactionManager应该足够我的目的,但描述说明如下
J2eeTransactionManager
J2EE应该使用的TransactionManager的实现 应用
..没有任何解释。
PS。对不起,我的英语不是很清楚。
答案 0 :(得分:0)
Ок,因为没有人回答我,在深入研究源代码后,我想我已经准备好回答我自己的问题了:
因此,拥有一个TM-per-webapp实例是安全的,您可以按照自己喜欢的方式进行共享。从Atomikos TM supposed to be instantiated开始,最好通过依赖注入来共享它。 Bitronix TM可以通过public static method用作任何其他单例。
此外,您可以通过JNDI管理交易。您可以在 Java Persistence with Hibernate 书籍源代码中找到一个示例。