gpt4 book ai didi

java - REQUIRES_NEW 内的 REQUIRES_NEW 内的 REQUIRES_NEW ... 不断

转载 作者:搜寻专家 更新时间:2023-11-01 01:06:52 27 4
gpt4 key购买 nike

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写入)

然后在那个时候展开?这会成为性能问题的原因吗?其他想法?

最佳答案

Does this actually create a new transaction every single time for every method call

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

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

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

关于java - REQUIRES_NEW 内的 REQUIRES_NEW 内的 REQUIRES_NEW ... 不断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8435318/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com