NHibernate中的Session
在我的理解似乎就相當於數據庫中連接
因為它也有Open/Close的方法
我沒有研究NHibernate的源碼
不知道這種理解是否有誤?我在網上搜了很多的關於Session的管理
大多都是在我需要數據庫操作的時候
就OpenSession()
操作完後就CloseSession()
這有點擬似如我們剛開始學習ADO
NET的時候
要Connection對象Open()
數據處理完後就Close()
但是這裡就帶來了一個弊端
因為Connection的頻繁的開關是非常消耗系統資源的
我記得以前在制作一個數據的錄入界面的時
因為這個錄入的界面數據元素比較多
而且很多DropDownList需要在數據庫中讀取數據並綁定
這樣在該頁面的Page_Load中需要調用相應對象的方法一一從數據庫中檢索數據綁定DropDownList
因為我們這些對象的方法都是使用獨立的Connection
都有自己的Connection的Open和Close
所以
導致這個頁面一打開就需要等待好長的時間
比較慢
後來我們將這些需要綁定DropDownList的數據通過一個數據處理成一個DataSet
並將DataSet中的DataTable與DropDownList綁定
這樣只需要一次的Connection的Open/Close
頁面快了好多
所以
我覺得上述的Session的管理辦法不是很妥當
後來
我看了Cuyahoga開源項目中他的Session管理
他使用的
session
per
request
這種模式
從字面上理解就是他為每個Request創建一個Session
直到這個請求銷毀
那麼這個Session也就Close了
而Cuyahoga他的做法和session
per
request有點不同地方就是
他為每個Request都創建了一個CoreRepository對象
CoreRepository是系統所需要的數據處理服務的類
他的做法是先創建了HttpModule(NHSessionModule)用來創建CoreRepository對象和銷毀CoreRepository對象
如下
private void Context_BeginRequest(object sender
EventArgs e)
{
// Create the repository for Core objects and add it to the current HttpContext
CoreRepository cr = new CoreRepository(true);
HttpContext
Current
Items
Add(
CoreRepository
cr);
}
private void Context_EndRequest(object sender
EventArgs e)
{
// Close the NHibernate session
if (HttpContext
Current
Items[
CoreRepository
] != null)
{
CoreRepository cr = (CoreRepository)HttpContext
Current
Items[
CoreRepository
];
cr
CloseSession();
}
}
這樣在每次請求的時候
會自動創建CoreRepository對象
當請求完畢後
就CloseSession()
在程序中通過HttpContext
Current
Items[
CoreRepository
]就能獲取CoreRepository對象了
這樣也就變相的管理了NHibernate中的Session
也就達到了
session
per
request
的這種模式
詳細的講解
通過實現IHttpModule初始化Nhibernate的Session
這種方式比上面的那個每次操作都需要創建Session
性能和速度應該提高了不少
接著我就想
每個請求都創建Session
是不是我們可以象創建Connection Pool一樣
也創建一個Session Pool
這樣就每次請求的時候不是直接創建Session
而是在我們的Session Pool中拿已經創建好的Session
這樣效率不是更好?!
From:http://tw.wingwit.com/Article/program/net/201311/12369.html