2012-07-17 75 views
1

當不使用事務時,它看起來像NHibernate的無狀態會話強制連接在每個語句(讀或寫)後關閉。是否有可能強制NHibernate的無狀態會話重新使用連接?

看着代碼,它出現了這種情況,因爲ConnectionManager的ConnectionReleaseMode自動設置爲AfterTransaction,而不使用事務被解釋爲在其自己的事務中執行每個語句。

有沒有方法可以改變這種行爲,並允許在會話的整個生命週期中重複使用單個連接?

我使用SqlClientDriver,萬一它很重要。

+0

當然,我可以調用'OpenStatelessSession()'傳遞我自己的連接,但是我必須將連接壽命與會話生命期限聯繫起來...... – 2012-07-17 15:57:46

+1

您的**實際**問題是什麼? (你試圖通過連接重用來解決的問題) – 2012-07-17 18:44:52

+0

我的主要問題是性能 - 我在會話的生命週期中執行大約15條語句,並且使用ApplicationRoles,因此每個連接建立都需要調用存儲的sp_setapprole PROC。通過當前的行爲,在會話的整個生命週期中,連接會被打開和關閉15次,而批准sp將被執行15次。 – 2012-07-18 07:46:54

回答

0

有沒有辦法改變這種行爲,並允許在會話的整個生命週期中重複使用單個連接 ?

是的。使用「hibernate.connection.release_mode」「on_close」,這樣連接只在NHibernate會話結束時關閉。

重要提示:僅當您使用諸如「session-per-request」或"session-per-conversation"等方法時,此選項纔有意義,因爲在這些情況下,可能會在事務邊界外發生大量「延遲加載」。請參閱: 「... This setting is left for backwards compatibility, but excellant use is highly discouraged ...」

+1

連接釋放模式似乎完全被無狀態會話忽略 - 恐怕它只是由標準(有狀態)會話強制執行。 – 2012-07-18 07:49:08

1

只是在NHibernate的交易包裹的一切(這可能是可取反正)。

交易處於開放狀態時,連接也會打開。

+0

我認爲,但在這些情況下(這是我的情況下的大多數),它的查詢集都是隻讀的(即只是SELECT的),或者可能是我只是過度敏感:-) – 2012-07-18 15:37:01

相關問題