2010-01-19 105 views
2

爲了避免XA開銷,我從前綴項目中的一些表名和滾出來是一樣的mysql數據庫是項目B的內部,所以我可以使用相同的連接 - 並希望得到全原子等多個會話工廠,一個連接?

A計劃和B雖然有非常不同的會話工廠配置。我爲項目B配置了HibernateTransactionManager,而A僅使用 TransactionSynchronizationManager.hasResource(sessionFactoryA) OSiV樣式代碼與事務一起使用。

這是否在工作原理?我剛剛在A中嘗試了一個斷點,然後等待,然後繼續,超時導致B回滾,但A仍然提交!!?

什麼給?謝謝你的幫助。

+0

我意識到需要使用相同的連接....這讓我想到了,如何提供一個自定義的hibernate.current_session_context_class,它可以查找不同的sessionFactory來返回相同的連接? – adam 2010-01-20 17:20:58

+0

好的。 hibernate.current_session_context_class不合適,但hibernate.connection.provider_class是!我可以實現這一點,並getConnection「返回staticSessionFactoryB.getCurrentSession()。連接();」 我的設置不需要內部事務等,並且默認的on_close會話的連接在tx結束,因此一切似乎都很好。我有一個真正的共享資源。請告訴我,如果你看到任何clangers!也許這是帕斯卡爾在下面提到的? – adam 2010-01-20 22:45:36

回答

2

儘管兩組實體都駐留在同一個數據庫中,但您仍然使用兩個不同的事務管理器配置了Spring。因此,最終會產生重疊但完全分離的事務,併爲每個事務使用不同的數據庫連接。

爲了使交易正常運行,您需要使用一個交易管理器,並通過它發送所有交易操作。

+0

謝謝 - 我意識到提供相同的數據源並不意味着使用相同的連接。一個事務會很好(使用aop在B的tx方法中搭載),但HibernateTransactionManger只管理一個工廠,因此只管理一個數據源...因此,我將不得不整個豬羣 - 還有jta事務管理器和XA mysql驅動程序? ?? – adam 2010-01-20 17:15:50

+0

使用JTA,或將會話工廠合併到一個配置中。 – skaffman 2010-01-20 17:24:04