小编Big*_*rni的帖子

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

我对以下方案中的交易性能和/或成本有疑问.

环境: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);
}
Run Code Online (Sandbox Code Playgroud)

此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);
}
Run Code Online (Sandbox Code Playgroud)

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

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)  
public void saveTerminal(TerminalSaveRequest request) {
    terminal.saveTerminal(request);
}
Run Code Online (Sandbox Code Playgroud)

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

进一步的信息:

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

问题:

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

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

感谢您对此主题的任何提示或想法.

伯恩哈德

java ejb-3.0 jboss7.x

9
推荐指数
1
解决办法
976
查看次数

标签 统计

ejb-3.0 ×1

java ×1

jboss7.x ×1