2012-04-25 87 views
0

在ThreadLocal中存儲一個NHibernate會話是否有意義,假設線程安全並且可以解決會話的延遲加載問題是否安全?假設只要線程正在執行,Session就可以使用了嗎?就線程而言,我在談論HttpRequet。每個線程與ThreadLocal的NHibernate會話

此外,我會用完NHibernate的會話嗎?是否有最大數量的會話?如果我有很多線程,那會好嗎?

+0

你是什麼意思,這個'線程安全,並將解決會話的延遲加載問題? – Rippo 2012-04-25 19:37:25

+0

通過延遲加載問題,如果您在視圖中引用了Mapped for Lazy加載的對象,則會獲得會話關閉異常。查看模式。線程安全,我得到每個線程會話?並且沒有競賽狀況會發生。 – DarthVader 2012-04-25 19:42:23

+0

我一直都認爲會話工廠是線程安全的,但會話並不是如此,以後使用ThreadLocal會咬你。 – Rippo 2012-04-25 20:37:06

回答

2

NHibernate會話不是線程安全的。 只要您將單個會話與應該正常工作的一個會話相關聯即可。

如果您要爲http請求使用會話每個請求實現的最佳方式,那麼會話在請求開始時打開,在請求結束時關閉。在這種情況下,假設只要線程正在執行,會話就可以使用。

通常NHibernate不會耗盡會話,但更好的做法是使用壽命最短的會話。

+0

是有意義的,並且取決於您正在獲取的連接數量,您可能會用盡連接。 – DarthVader 2012-04-26 06:25:38

+0

@DarthVader:Session!=連接。你可以有任意數量的nh會話對象(僅受系統內存限制)http://ayende.com/blog/4123/what-is-the-cost-of-opening-a-session。 – Andreas 2012-04-26 21:25:19