2009-08-03 84 views
5

我將Oracle 11g用於我的數據庫,並將其Oracle Streams AQ功能用作JMS實現。使用Oracle Streams AQ在Spring MDB中共享JMS和Hibernate事務?

對於我所知道的,應該可以實現基於Spring的消息驅動的POJO(MDP),它使用相同的數據源來處理事務性數據訪問和JMS事務 - 所有這些都沒有XA事務(IIRC,this作爲SpringSource Advanced Pack for Oracle的一個功能銷售)。

這可能使用Hibernate嗎?理想情況下,我的MDP將啓動JMS事務並從隊列中讀取消息,然後通過Hibernate重新使用該事務進行數據訪問。如果出現任何問題,JMS和數據庫事務都將被回滾,而不使用兩階段提交(2PC)。

我不是一個交易大師,所以在我開始深入挖掘之前,誰能證實這是可能的,並且合理嗎?

更新:
我要的是Shared Transaction Resource pattern的實現。 sample code演示了它對於ActiveMQ和JDBC,但我需要使用Oracle Streams AQ和Hibernate。

UPDATE2: SpringSource的高級包甲骨文一直open sourced如春的數據JDBC的一部分,它「提供了使用本地事務經理都 數據庫和郵件訪問的選項,而不訴諸昂貴金紅利2交易管理「階段提交 。

回答

3

2PC應該不是必要的,正如你所說,因爲應用程序服務器應該照顧它。但是,由於JMS只適用於JTA,因此幾乎必須使用JTA(即JavaEE容器)事務,而不是使用vanilla DataSource事務。

這是不是一個大問題,它更只是有點繁瑣:

  1. 你的Spring配置應該使用 <jee:jndi-lookup/>獲得 參考你的容器的 DataSource,並且你注入該 數據源進入你的spring-managed 休眠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 2009-08-04 01:07:14

相關問題