JBoss 4.x
EJB 3.0
我见过类似以下的代码(大大缩写):
@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class EJB1 implements IEJB1
{
@EJB
private IEJB1 self;
@EJB
private IEJB2 ejb2;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean someMethod1()
{
return someMethod2();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean someMethod2()
{
return self.someMethod3();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean someMethod3()
{
return ejb2.someMethod1();
}
}
并假设 EJB2 几乎是 EJB1 的精确副本(相同的三个方法),并且EJB2.someMethod3()
呼叫EJB3.someMethod1()
,然后最终在EJB3.someMethod3()
写入数据库。
这是一个人为的示例,但在我们的代码库中看到了与上面类似的代码。该代码实际上运行得很好。
然而,这感觉是一种糟糕的做法,我担心@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
在每个甚至不实际执行任何数据库写入的方法上。这实际上是否每次都会为每个方法调用创建一个新事务,其结果为:
新交易
-新交易
--新交易
---新交易
...(还有很多)
--------新事务(DB写入)
然后在那时解开?这会成为性能问题的原因吗?其他想法?
这实际上每次都会创建一个新交易吗
每个方法调用
不,事实并非如此。仅当从另一个 bean 通过 EJB 引用调用方法时才会创建新事务。调用method2 from method1在同一个 bean 中不会产生新的事务。
也可以看看here https://stackoverflow.com/questions/427452/ejb-transactions-in-local-method-calls and here http://entjavastuff.blogspot.com/2011/02/ejb-transaction-management-going-deeper.html。后者是一篇非常好的文章,解释了 EJB 中的事务管理。
Edit:
感谢 @korifey 指出,method2 实际上调用了 bean 引用的 method3,从而产生了一个新事务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)