在我们的应用程序中,我们为业务逻辑创建新的事务。因此,为此,我们首先将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
}