首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >REQUIRES_NEW中的REQUIRES_NEW在REQUIRES_NEW中...一次又一次

REQUIRES_NEW中的REQUIRES_NEW在REQUIRES_NEW中...一次又一次
EN

Stack Overflow用户
提问于 2011-12-09 01:49:37
回答 2查看 8.1K关注 0票数 4

JBoss 4.x

EJB 3.0

我见过下面这样的代码(大大简化了):

代码语言:javascript
复制
@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事务

--新事务

-新交易

...(更多)

-新事务(数据库写入)

然后在这一点上展开?这会成为性能问题的原因吗?其他想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-09 02:02:59

实际上,每次调用方法时,

都会创建一个新事务

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

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

编辑:

感谢@korifey指出,method2实际上在bean引用上调用了method3,从而产生了一个新事务。

票数 12
EN

Stack Overflow用户

发布于 2011-12-09 01:56:50

它确实在每个EJB中创建了新的JTA事务,这肯定会对只读方法(只做选择,不做更新)产生严重的性能影响。将@SUPPORTS用于只读方法

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8435318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档