2010-12-30 6 views
6

私たちは技術スタックを再考する過程にあり、以下は私たちの選択です(アプリケーションの複雑さなどのためSpringとHibernateなしでは生きられません)。また、JPA2 + Hibernate 3.6.0でのJTAまたはLOCALトランザクション?

  1. のJava EE 5
  2. JPA 2.0(Iは、Java EE 5のみ JPA 1.0をサポートしています知っているが、我々は休止状態 を使用するスタック技術

    5のJava EEへのJ2EE 1.4から移動しています
  3. )JPAプロバイダとしてので、我々はこれは、我々は両方のJPAをしたい を意味します。JPAに、この時点で にそれらを移行する必要はありません。我々はすでにカスタムタイプ などでHBMファイルの たくさんある(3.6.0を休止/ hbmマッピングは、今の問題は、私は、ローカル・トランザクションに固執したいが、他のチームメンバーがしたいということです

)にHibernate JPAプロバイダ などの代わりに、アプリケーション Serverに付属 デフォルトを使用して一緒に、したがって 仕事しますJTAを使用してください。私は過去9年間J2EEに取り組んできました。私は2度のコミットが必要ない場合には、ローカルトランザクションに固執することを何度も聞いてきました。これはパフォーマンス上の理由だけでなく、ローカルトランザクションのデバッグ/トラブルシューティングはJTAよりはるかに簡単です(JTAが必要な場合は単一フェーズコミットを実行する場合でも)。

私の提案は、私は私が妄想しているのですか、私は有効なポイントを持っている場合を確認するに春宣言的トランザクション管理+ローカルトランザクション(HibernateTransactionManager)代わりのコンテナJTA

を使用することです。私は、Java EE世界の残りの部分が何を考えているか聞いてみたいと思います。あるいは、私に適切な記事を指摘してください。

+0

もっと提案? –

答えて

5

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

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

UPDATE:

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

+0

右。トランザクションのためにバネを使用するためのアイデアの使用。私はJTAが実際に2相を意味するわけではないことを理解していますが、JTAのためになぜ2相を望んでいないことがわかっているのですか? –

+0

Springの宣言型トランザクション管理+ローカルトランザクションを使用することをお勧めします –

+1

ローカルトランザクションを使用する場合、春に "org.springframework.transaction.jta.JtaTransactionManager" beanを定義する必要はありません。私はちょうど "HibernateTransactionManager"または "JpaTransactionManager"を定義します –

7

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

たとえば、特定のデータソースを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以降、これ以上のケースではない可能性があります。複雑な大企業のものは、2011年の工場技術の共通点です。

これは以前は完全に無関係だったEJBのために私たちが抱いていた不安とこれを比べると、 (明らかにJavaプログラマーにとっては問題ではない)、あるいは長い間この業界に参加しているときには、関数呼び出しのような基本的なことをすることへの恐怖;)

+0

あなたは次のように書いています: "あなたのDBを表すデータソースはXAではないかもしれません。 XAでないことが許されています。この場合、非XAが許可されるのはなぜですか?実際、トランザクションコミット後の結果のグローバル性に関する不安定な振る舞いに頼ることはできないでしょうか?たとえば、この非XAリソースが2フェーズコミットをサポートできない場合、グローバルトランザクション(複数のデータソースをターゲットとする)が正常に行われたことをどうすれば確認できますか? – Mik378

+1

@ Mik378は、「最後のリソースコミットの最適化」の私の考え方を見てください。コミットする最後のリソースの順番である場合、あなたは以前知らなかった特定のものを知っています。*すべての*他のリソースがコミットできます。したがって、完全なTXがコミットできるかどうかは、この最後のリソースにのみ依存します。それは単純です。それが実際にコミットすれば、TX全体がコミットされ(コミットできると既に述べた他のものを意味する)、コミットしない(例えばスローする)と、他のものがロールバックされる。 –

+0

私は "最後のリソースコミット"の概念を知らなかった。今、私はルールを理解しています "非XAデータソースは許されていますが、それ以上はありません"ありがとう:) – Mik378

関連する問題