通过多个EJB与一个EJB进行事务的性能成本

时间:2013-05-30 08:33:17

标签: java ejb-3.0 jboss7.x

我对以下情况中的交易表现和/或成本有疑问。

环境:JBoss 7.1.1 / Oracle 11G / Java 6

场景A - 1 EJB:

我创建了一个EJB,它使用CMP(Transaction REQUIRES_NEW)将记录保存到数据库中:

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)  
public void saveTerminal(TerminalSaveRequest request) {
    TerminalEntity terminalEntity = new TerminalEntity();
    terminalEntity.setId(request.getId());
    ...

    entityManager.persist(terminalEntity);
}

此EJB由外部EJB客户端调用(没有任何JTA trx)并且执行良好(1000次插入/秒)。 JBoss还记录了JPA测量中的确切交易量。

情景B - 2 EJBS:

我已经更改了应用程序并添加了另一个EJB从方案A调用EJB,尽管在这里我希望新EJB打开一个“共享”事务。所以我已经改变了现有的EJB(Transaction REQUIRED):

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)  
public void saveTerminal(TerminalSaveRequest request) {
    TerminalEntity terminalEntity = new TerminalEntity();
    terminalEntity.setId(request.getId());
    ...

    entityManager.persist(terminalEntity);
}

在新的EJB中,我开始新需要的事务并调用(本地)EJB:

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)  
public void saveTerminal(TerminalSaveRequest request) {
    terminal.saveTerminal(request);
}

现在,一切都按预期工作(相同数量的事务等),虽然性能已经从1000急剧下降到200插入一秒,这很麻烦,因为这两个EJB之间的事务处理似乎花费了4倍插入:(

进一步的信息:

  • 没有其他EJB或方法正在使用此事务。
  • 本地接口
  • 本地DS

问题:

  • 在一个EJB中打开一个事务并在另一个EJB中使用它真的很昂贵吗? (因为在第一个例子中仍然有一个事务和一个插入)。
  • 如果一个“Dispatcher”在一个事务中调用多个其他EJB,那么事务处理的成本是每个事务处理一次还是每个EJB调用一次?!

如果需要更多信息,我会很乐意发布更多信息。

感谢您对此主题的任何暗示或想法。

哈德

1 个答案:

答案 0 :(得分:3)

您是否尝试过让EJB使用@TransactionAttribute(TransactionAttributeType.REQUIRED)并让JBoss决定在哪里划分交易?