2009-08-03 17 views
5

私は自分のデータベースにOracle 11gを使用しています。また、JMS実装としてOracle Streams AQ機能を使用しています。Oracle Streams AQを使用したSpring MDBでのJMSおよびHibernateトランザクションの共有

トランザクションデータアクセスとJMSトランザクションの両方に同じデータソースを使用する、Springベースのメッセージ駆動型POJO(MDP)を実装することが可能です。すべてXAトランザクションなし(IIRC、これSpringSource Advanced Pack for Oracleの機能として市販されていました)。

これはHibernateでも可能ですか?理想的には、私のMDPはJMSトランザクションを開始し、キューからメッセージを読み込み、Hibernateを介してデータアクセスのためにトランザクションを再利用します。何か問題が生じた場合は、2フェーズコミット(2PC)を使用せずに、JMSとデータベーストランザクションの両方がロールバックされます。

私はトランザクションの専門家ではないので、深く掘り下げる前に誰でもこれが可能であり、意味があることを確認できますか?

更新:
私が欲しいものはShared Transaction Resource patternの実装です。 sample codeはActiveMQとJDBCのためにそれを示していますが、Oracle Streams AQとHibernateを使用する必要があります。

アップデート2: Oracle用のSpringSource Advanced Packには、春データJDBCの一部としてopen sourcedされていると、それは「高価な分散2に頼らずに データベースとメッセージアクセスの両方のための単一のローカルトランザクションマネージャを使用するオプションを提供しますフェーズコミット トランザクション管理 "。

答えて

3

2PCは必要ではありません。あなたが言うように、アプリケーションサーバーがそれを処理する必要があるからです。ただし、JMSはJTAのみで動作するため、バニラDataSourceトランザクションではなく、JTA(JavaEEコンテナ)トランザクションを使用する必要があります。

これは、それだけで少し厄介だ、大したことではありません。

  1. あなたの春の設定は、あなたのコンテナの DataSourceへ の参照を取得するために <jee:jndi-lookup/>を使用する必要があり、そしてあなたがその データソースを注入あなたの春に管理された のSessionFactoryに入れます。
  2. トランザクションマネージャをコンテキストに導入する必要があります(<tx:jta-transaction-manager/>はほとんどのアプリケーションサーバーで機能するはずです)。
  3. Spring JMS MessageListenerContainerに、上記のトランザクションマネージャリファレンスをプラグインします。

これはすべて意味がありますか、それとも私が詳しく説明してください。この設定は、である必要があります。コンテナ管理のトランザクションがJMSとHibernateのやり取りを介して確実に保持されるようにします。

+0

+1。しかし、「XA-Transactionsがない(IIRC、これはSpringSource Advanced Pack for Oracleの機能として販売されていたもの)」という文については不思議です。私は、複数のノード(JMSやDAなど)にまたがるトランザクションがXAトランザクションでなければならず、2PCを使用しなければならないことは非常に肯定的です。これは通常、シーンの背後にあるコンテナによって行われます。私が間違っている?何とかそれが不要になるいくつかの新しい素晴らしい技術はありますか? – ChssPly76

+0

ご意見ありがとうございます。私は少し深く掘り下げてから質問を更新しました。 リンク先の記事で説明したように、私はJTAとXAを完全に避けたいと思います。 [SpringSource Advanced Pack for Oracle](https://www.springsource.com/products/enterprise/oraclepack)のドキュメント(こちら[http://www.springsource.com/downloads/springsource-advanced-pack] -for-oracle-database-download))にもその可能性が言及されています(残念ながらここで引用するには長すぎる3.2章の最後の段落を参照してください)。 –

+1

JTAを使わずにデータソースとJMS間でtxコーディネーションを行う方法はありません。 – skaffman

関連する問題