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
发布于 2011-12-09 01:56:50
它确实在每个EJB中创建了新的JTA事务,这肯定会对只读方法(只做选择,不做更新)产生严重的性能影响。将@SUPPORTS用于只读方法
https://stackoverflow.com/questions/8435318
复制相似问题