次のシナリオでのトランザクションのパフォーマンスやコストについて質問があります。
環境: JBoss 7.1.1 / Oracle 11G / Java 6
シナリオ A - 1 EJB:
CMP (Transaction REQUIRES_NEW) を使用してレコードをデータベースに保存する EJB を 1 つ作成しました。
@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);
}
ここでも、すべてが期待どおりに機能します (同じ量のトランザクションなど)。ただし、パフォーマンスは 1 秒あたり 1000 から 200 挿入に劇的に低下しました。
詳細情報:
- 他の EJB またはメソッドはこのトランザクションを使用していません。
- ローカル インターフェイス
- ローカル DS
質問:
- トランザクションを 1 つの EJB で開き、別の EJB で使用するのは本当にコストがかかるのでしょうか? (最初の例のように、まだ 1 つのトランザクションと 1 つの挿入があるため)。
- 1 つのトランザクションで他の複数の EJB を呼び出す 1 つの「ディスパッチャ」がある場合、トランザクション処理のコストはトランザクションごとに 1 回か、EJB 呼び出しごとに 1 回か?!
さらに情報が必要な場合は、喜んで投稿します。
このトピックに関するヒントや考えをありがとう。
ベルンハルト