我对以下场景中的交易性能和/或成本有疑问。
环境: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 调用一次?!
如果需要更多信息,我会很乐意发布更多信息。
感谢您提供有关此主题的任何提示或想法。
伯恩哈德