【问题标题】:@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) taking way too much time for commit transaction@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 提交事务花费了太多时间
【发布时间】:2017-02-01 03:53:16
【问题描述】:

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

A.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 调用之后的时间: strong> 就像 400 到 500 毫秒,几乎占总时间的 40% 到 50%。并且两个 sysout 操作之间没有其他逻辑。

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

【问题讨论】:

  • B() 的调用是本地调用,甚至不会启动新事务。
  • 请提供可编译的代码。这不会编译。
  • 这是原始代码的示例代码。我无法提供整个原始代码太大。但这里我试图解释原始代码的流程。方法B()是通过依赖注入调用。像 @IgnoreDependency @EJB(mappedName = "JNDINAME")。甚至所有的方法调用,无论是从A类到B,还是从B到B的方法调用,都在使用依赖注入。

标签: java hibernate jpa ejb-3.0 jboss6.x


【解决方案1】:

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

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

public Object B() {
    //start tx
    doSomeDatabaseChange(); //quite fast

    return obj;
    // commit or rollback tx, may take time
} 

【讨论】:

  • 感谢您的回复,非常感谢。是的,您是对的,总时间中包含数据库提交时间。但在我们的特殊情况下,我发现在一个地方我们错过了关闭 JDBC 连接。因此,由于我们使用 jboss 作为事务管理器,在提交 jboss 后,它会自动为我们关闭打开的连接。这是时间最多的地方。修复该问题后,时间会减少。大约需要 10%总时间的 20%。
猜你喜欢
  • 2012-07-21
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2017-02-15
  • 2020-07-23
  • 2013-07-11
  • 2014-01-13
相关资源
最近更新 更多