我对以下情况中的交易表现和/或成本有疑问。
环境: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倍插入:(
进一步的信息:
问题:
如果需要更多信息,我会很乐意发布更多信息。
感谢您对此主题的任何暗示或想法。
哈德
答案 0 :(得分:3)
您是否尝试过让EJB使用@TransactionAttribute(TransactionAttributeType.REQUIRED)
并让JBoss决定在哪里划分交易?