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()中写入DB。
这是一个人为的例子,但在我们的代码库中看到了与上面类似的代码。代码实际上工作得很好。
然而,这感觉像是可怕的实践,我担心每个方法上的@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW),这些方法甚至不实际执行任何DB写操作。这是否真的会在每次调用方法时都创建一个新事务,其结果为:
新事务
-new事务
--新事务
-新交易
...(更多)
-新事务(数据库写入)
然后在这一点上展开?这会成为性能问题的原因吗?其他想法?
发布于 2011-12-09 02:02:59
实际上,每次调用方法时,
都会创建一个新事务
不,不需要。只有当从另一个bean通过EJB引用调用方法时,才会创建新的事务。在同一个bean中从method1调用method2不会产生新事务。
另请参见here和here。后者是一篇非常好的文章,解释了EJB中的事务管理。
编辑:
感谢@korifey指出,method2实际上在bean引用上调用了method3,从而产生了一个新事务。
发布于 2011-12-09 01:56:50
它确实在每个EJB中创建了新的JTA事务,这肯定会对只读方法(只做选择,不做更新)产生严重的性能影响。将@SUPPORTS用于只读方法
https://stackoverflow.com/questions/8435318
复制相似问题