要求在REQUIRES_NEW内的REQUIRES_NEW内......等等

时间:2011-12-08 17:49:37

标签: java java-ee ejb-3.0

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)甚至不会实际执行任何数据库写入。这是否实际上每次为每个方法调用创建一个新事务,结果为:

新交易
- 新交易
- 新交易
---新交易
......(更多)
-------新的transaciton(DB写)

然后在那时解开?这会不会引起性能问题?额外的想法?

2 个答案:

答案 0 :(得分:12)

  

这是否实际上每次创建一个新事务   每个方法调用

不,它没有。只有在通过另一个bean的EJB引用调用方法时,才会创建新事务。在同一个bean中从 method1 调用 method2 将不会产生新事务。

另请参阅herehere。后者是非常好的文章,解释了EJB中的事务管理。

修改
感谢@korifey指出,该方法2实际上在bean引用上调用method3,从而导致新的事务。

答案 1 :(得分:4)

它确实在每个EJB中创建了新的JTA事务,这必须对只读方法(仅使SELECTS,而不是更新)产生严重的性能影响。将@SUPPORTS用于只读方法