2017-03-13 7 views
0

私はJBoss EAP 6.4(Java EE 6)で作業していますが、アプリケーションサーバーがXAデータソース(EJB/JTAを使用)を扱う方法に関する質問があり、2フェーズコミット)が常に使用されているか、「最適化」が適用されているかを示します。XAデータソースの1PC最適化

のは、私はこれを持っているとしましょう:

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class MyEjb { 
    @EJB 
    private MyFirstEjb first; 

    @EJB 
    private MySecondEjb second; 

    // Transactional processing 
    public void process() { 
     first.processJpaStuff(); 
     second.processJpaStuff(); 
    } 
} 

だがそれを言ってみましょう:

  • MyFirstEjb行うXAデータソースを使用してJPAクエリ1.
  • MySecondEjb行う2.
  • XAデータソースを使用してJPAクエリ

私はXAデータソースを使用しています。これらのEJBは、2PC i (別のデータソースまたはJMSプロバイダとともに)必須です。

私は今、いくつかのケースを区別したいと思います

:同じアプリケーション・サーバー内

  1. MyFirstEjbとMySecondEjbは、同じアプリケーション内で展開されている(EAR)
  2. MyFirstEjbとMySecondEjbは別個のアプリケーションで展開されている(耳)

    0:
  3. MyFirstEjbとMySecondEjbは、異なるアプリケーションサーバ

とサブケース内に配備されています

A)XAデータソース1 = XAデータソース2

b)は、XAデータソース1!= XAデータソース2(同じデータベース)

C)XAデータソース1!= XAデータソース2(異なるデータベース)

私はb)とc)が同じように管理されていると思います。グローバルトランザクションがあり、各データソースはXAトランザクションマネージャーとコラボレーションします。 2PCが適用されます。

ケース1.a)と2.a)についてはどうですか?どちらも最終的に同じデータソースを使用しているので、処理するグローバルな2PCトランザクションを必要としない何らかの最適化があると思いますか? 「はい」の場合、これを説明する正式な(JTA/JBoss/...)リンクはありますか? すべてのアプリケーションサーバー/実装で同じことはありますか?

おかげ

答えて

1

によって異なります。

JTA(トランザクションコーディネータ)は、EJBまたはアプリケーションについて何も知らない。これは、XAResourcesと関連するトランザクションブランチだけに関係しています。通常の場合、エンティティBeanに対してJPAが使用する接続プールを管理するJCAは、使用されるデータソースごとに1つのXAResourceをJTAに提供します。 JTAは、同じグローバルtx idの下で、それぞれ異なるブランチ修飾子を割り当てます。

トランザクション終了時に、JTAは各XAResourceを準備します。この時点で、最適化が行われます.dbエンジンは、同じグローバルtxに対して複数のブランチ(接続/ XAResources)があることを検出すると、最初のXAResourceではなく、残りのリソースからREAD_ONLYを返します。結果としてtxがPREPAREDリソースを1つしか持たず、残りがすべて読み取り専用であると仮定すると、残りの部分を最適化することができます。例えば、

http://narayana.io/docs/product/#two-phase-variants

https://docs.oracle.com/cd/B10501_01/java.920/a96654/xadistra.htm#1061004

注ベンダーに依存し、 'DBエンジン' と 'データベース' はまったく同じものではありません。一部のシステムでは、同じサーバー上で複数のdbsをホストし、それらのサーバー間で最適化を行うことができますが、別のシステムでは個別のトランザクションエンジンのスコープとして扱い、最適化はしません。データソースは、接続に使用されるユーザーID /スキーマのみが異なる場合もあります。そのためには、権限/スキーマの名前空間を使用してアプリケーションを分離します。このような場合、最適化はほぼ常に有効です。

アプリケーションが同じXADatasourceを使用する場合、JCAは1つのXAResourceをJTAに登録し、潜在的にはより積極的な1PC最適化を使用する可能性があります。

接続がローカルとXAのトランザクションコンテキストを切り替える可能性はありますが、現時点でJTAがこれを利用することはできません。リソースはオンデマンドでのみ参加するため、システムは終了段階に達するまで、トランザクションに参加する人の数を認識しません。 JTAスペックグループは、txタイムアウトが設定される方法と同様に設定を許可することについてすでに説明していました。これにより、アプリケーションは、txが単一リソースであることが期待されることを開始時に示すことができます。その情報により、必要に応じてXAモードではなく、ローカルのtxモードでリソースを駆動し、start/end/prepareプロトコル呼び出しを省略することができます。また、アプリケーション内の同じデータベースに対してXAおよび非XAデータソースの両方をデプロイすることで、そのようなケースを手動で最適化する必要性がなくなります。それは現在のロードマップにはありません。

+0

うわー...この詳細な説明とこれらの重要なリンクに感謝します!これは複雑な主題であっても非常に興味深く、はるかに明確になります。 最適化がベンダー固有であることを確認します。 ありがとう –

1

あなたはおそらく知っているように、ドライバおよび基礎となるデータソースができない場合はデータソースは、異なる場合1.MyFirstEjbとMySecondEjbは、同じアプリケーション(EAR)

に配備されていますグローバルトランザクションに参加するか、ドライバがグローバルトランザクションに参加するように設定されていない場合は、特定のエラーが発生します。

その他のケースでは、理想的なシナリオは、両方のデータソースを扱うビジネスレイヤーであり、すべてのクライアントがビジネスレイヤーを扱います(同じデータソースを扱う異なるアプリケーションはまったく避ける必要があります)。これは起こり得ることです。

2。MyFirstEjbとMySecondEjbは同じアプリケーションサーバー内の別々のアプリケーション(EAR)にデプロイされます

同じアプリケーションサーバーにデプロイされていて異なるクライアントがリモートインターフェイスを介してアクセスするため、スレッド/トランザクション(REQUIRES_NEW)。何か問題が生じた場合、クライアントはEJBExceptionを取得します。クライアントの観点からはグローバルトランザクションはありません。

3.MyFirstEjbとMySecondEjbは、異なるアプリケーションサーバ

EJBが別のアプリケーションサーバーにデプロイされている場合、同じは適用内で展開されています。それらはリモートインタフェースを介してアクセスされるため、それぞれ新しいトランザクションを開始します。

+0

これらの追加説明をいただきありがとうございます。 実際、ドライバがグローバルトランザクションに参加するように設定されていないと、XAExceptionが発生します。 しかし、最適化に関する私の主な懸念には答えません。私は興味深い投稿([リンク](http://integrationspot.blogspot.fr/2011/03/jta-transactions-local-and-global.html))が見つかりました。「XAデータソースは2フェーズコミットをサポートできます* "[...]アプリケーションサーバは**"リソースの最適化 "**を実行し、RMLTのリソースマネージャーと対話します。" それは動作しますか? –

+0

この回答もあります[http://stackoverflow.com/questions/5130934/jta-datasources-without-transactions#answer-5452025](http://stackoverflow.com/questions/5130934/jta-datasources-without-トランザクション#answer-5452025)、「XAをサポートするリソースで非XAトランザクションを開始し、ローカルでコミットすることは完全に可能です。しかし、同じデータソースにアクセスし、JTAとEJB CMTに依存するとどうなりますか? –