9

次のシナリオでのトランザクションのパフォーマンスやコストについて質問があります。

環境: 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 回か?!

さらに情報が必要な場合は、喜んで投稿します。

このトピックに関するヒントや考えをありがとう。

ベルンハルト

4

1 に答える 1

3

EJB を使用@TransactionAttribute(TransactionAttributeType.REQUIRED)し、代わりに JBoss にトランザクションの境界を決定させることを試みましたか?

于 2013-06-01T22:53:44.380 に答える