9

我对以下场景中的交易性能和/或成本有疑问。

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

场景 A - 1 EJB:

我创建了一个 EJB,它使用 CMP(事务 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:

我更改了应用程序并添加了一个从场景 A 调用 EJB 的进一步 EJB,尽管在这里我希望新 EJB 打开一个“共享”事务。所以我改变了现有的 EJB 如下(需要事务):

@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 中使用真的那么昂贵吗?(因为在第一个示例中仍然有一个事务和一个插入)。
  • 如果一个“调度程序”在一个事务中调用多个其他 EJB,那么事务处理的成本是每个事务一次还是每个 EJB 调用一次?!

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

感谢您提供有关此主题的任何提示或想法。

伯恩哈德

4

1 回答 1

3

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

于 2013-06-01T22:53:44.380 回答