2011-11-14 29 views
8

我在調試我們的webapp。它被配置爲在啓動時創建一個DataSourceTransactionManager bean和一個HibernateTransactionManager bean。這不是有意的,而是由第三方依賴造成的。效果似乎是良性的。通過調試我看到的是,當我們通過基於Hibernate的DAO持久對象時 - 調用DataSourceTransactionManager而不是HibernateTransactionManager(這兩個bean都稱爲「transactionManager」)。 Spring Javadoc意味着(我認爲,現在重新閱讀它)這對當地資源來說很好 - 這就是我們的情況。即它不是基於分佈式JTA的環境。使用DataSourceTransactionManager進行ORM持久化而不是HibernateTransactionManager可以嗎?

我的問題是 - 沒有使用HibernateTransactionManager進行基於ORM的持久性的任何負面影響。我可以更改配置,使HibernateTransactionManager通過我們的DAO上@Transactional註釋的限定符來使用。

事情在簡單的單元測試,集成測試設置中工作正常,但是當我們有成千上萬的用戶和高水平的併發時,我更關心擴展到完整的產量。

TIA, 希望這不是太晦澀。

Spring 3.0.x順便說一句。

這是在Spring 3.1文檔。

Sec 11.9「解決常見問題」。

根據您選擇的交易技術和要求,使用正確的PlatformTransactionManager實施。

回答

6

這會引起我的錯誤並導致問題。如果沒有hibernate txn管理器,所有對HibernateOperations的調用都將在一個事務之外並且在一個單獨的會話中,可能使用自動提交。因此,當出現錯誤時,您可能會發現一切正常,您可能會發現您希望回滾的更改不會發生。

請嘗試以下方法檢查

  • 的begin tran
  • 保存的東西
  • 拋出異常
  • 提交

檢查 '東西' 是否出現在DB與否。

另一個檢查是

  • 的begin tran
  • 負載的東西
  • 訪問的關係從某事物另一個對象與此相關對象的訪問屬性(而不是PK)

您可能會發現最後一次調用導致異常,因爲會話並未從加載保持打開,因爲封閉txn不受hibernate txn管理器管理。

+0

+1嗯。有趣。謝謝。將嘗試其中一項測試。我所看到的是DAO調用發生在事務中,並且DAO調用getSession() - 所以Spring SessionFactoryUtils返回一個新的會話,並且一切似乎都很好。但正如你所說 - 我們多久會記得休息回滾。 –

+4

不錯的一個。我試過這個測試。保存後引發異常,Hibernate tx mgr保存被回滾。使用DataSourceTransactionManager它不是。 –

+0

您能否提供支持您的單詞的官方文檔「如果沒有hibernate txn管理器,所有對HibernateOperations的調用都將在事務之外並在單獨的會話中」?我正在使用DataSourceTransactionManager + Hibernate。 – DerekY

相關問題