6

私たちは技術スタックを再考する過程にあり、以下が私たちの選択です (アプリの複雑さなどにより、Spring と Hibernate なしでは生きられません)。また、J2EE 1.4 から Java EE 5 に移行しています。

技術スタック

  1. JavaEE5
  2. JPA 2.0 (Java EE 5 が JPA 1.0 のみをサポートしていることは知っていますが、Hibernate を JPA プロバイダーとして使用したいと考えています)
  3. Hibernate 3.6.0 (カスタム タイプなどの多くの hbm ファイルが既にあるため、現時点ではそれらを JPA に移行したくありません。つまり、jpa/hbm マッピングの両方を連携させて、Hibernate を JPA として動作させる必要があることを意味します) App Server に付属のデフォルトを使用する代わりにプロバイダー)

問題は、私はローカル トランザクションに固執したいのですが、他のチーム メンバーは JTA を使用したいということです。私は過去 9 年間 J2EE を使用してきましたが、2 フェーズ コミットが必要ない場合は、ローカル トランザクションを使用することを勧める人々の声を何度も耳にしました。これはパフォーマンス上の理由だけでなく、ローカル トランザクションのデバッグ/トラブルシューティングは JTA よりもはるかに簡単です (JTA が必要なときに単一フェーズ コミットのみを行う場合でも)。

私の提案は、コンテナー JTA の代わりに、Spring 宣言型トランザクション管理 + ローカル トランザクション (HibernateTransactionManager) を使用することです。

私が偏執病なのか、それとも正当な主張があるのか​​ を確認したい. Java EE の世界の残りの部分がどう思うか聞きたいです。または、適切な記事を教えてください。

4

2 に答える 2

7

Duffy が既に述べたように、JTA は、XA プロトコルを介して行われる 2 フェーズ コミットと同義ではありません。

たとえば、JBoss AS では、特定のデータ ソースを xa-datasource にするか tx-datasource にするかを明示的に選択できます。どちらの場合も、トランザクションは JTA を介して管理されます。

場合によっては、知らないうちにすでに JTA を使用している可能性があります。JMS メッセージをトランザクションとして送信するか、データベース内の何かを変更するのと同じトランザクションでトランザクション キャッシュを更新すると、トランザクション マネージャは自動的に XA モードに切り替わります。DB を表すデータソースは XA ではないかもしれませんが、XA トランザクションでは 1 リソースを非 XA にすることができます。このリソースへの更新は、last resource commit optimization.

常にリスクを計算し、自分でテストする必要がありますが、根拠のない恐怖に対して警告したいと思います. XA は、私たち開発者が恐れるようになったものの 1 つです。最近、これについて JBoss フォーラムで興味深い議論がありました: when to use xa-datasource

問題は、XA は過去には標準以下の実装を伴う複雑なテクノロジーだった可能性があるということですが、この FUD からほぼ 10 年半が経過した今では、そうではなくなっている可能性があります。1995 年には複雑な大企業向けのものでしたが、2011 年には一般的なミル テクノロジが実行されていました。

これを、私たちがかつて抱いていた EJB に対する恐怖と比較してください。EJB はもはや完全に無関係であり、仮想マシンに対する恐怖 (明らかに Java プログラマーにとっては問題ではありません)、または実際にこの業界に長く参加しているときの恐怖と比較してください。時間、関数呼び出しのような基本的なことをすることへの恐怖;)

于 2011-01-02T12:20:37.703 に答える
5

JTAは、2フェーズコミットを意味するものではありません。2フェーズコミットを可能にするのは、JTAドライバーとXAドライバーの組み合わせだと思います。

コードにトランザクションロジックを埋め込むよりも、JTAと宣言型トランザクションを使用することをお勧めします。トランザクションは、アスペクト指向の方法で行うのが最適です。

アップデート:

あなたが投稿した追加情報で、私はあなたの議論に同意します。Spring宣言型トランザクションとHibernateTransactionManagerクラスを使用することをお勧めします。

于 2010-12-30T03:29:54.147 に答える