@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)



在我们的应用程序中,我们为业务逻辑创建新的事务。因此,为此,我们首先将NOT_SUPPORTED标记为我们的包装器方法,然后该包装器方法调用具有REQUIRES_NEW的实际业务逻辑方法。现在的问题是,当调用返回到包装器方法时,时间差异几乎是整个 API 时间的 40% 到 50%。这是我的代码片段:

答.java

public Object A(){
    long stime = System.currentTimeMillis()
     b.BWrapper();  
     sysout("Time taken by API :"+System.currentTimeMillis() - stime);
}

B.java

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public Object BWrapper(){
     B();
     sysout("Time just after method B call:"+System.currentTimeMillis());
     return ob;
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public Object B(){
    sysout("Time before returning ob:"+System.currentTimeMillis());
    return ob;
} 

因此,假设如果 API 花费的时间:1 秒,那么返回 ob: 之前的时间和方法 B 调用后的时间之间的差异将像 400 到 500 毫秒,几乎是总时间的 40% 到 50%。并且在两个系统输出操作之间没有其他逻辑。

那么这背后的原因是什么呢?

EJB 框架为您执行的幕后逻辑,即提交事务,这可能是昂贵的。它是在方法返回后完成的。

要理解,由于业务方法内部的事务更改并没有真正执行任何数据库提交,因此您的 sysout 实际上可能是正确的,但真正的繁重工作是在方法返回之后完成的。

public Object B() {
    //start tx
    doSomeDatabaseChange(); //quite fast
    return obj;
    // commit or rollback tx, may take time
} 

最新更新