熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Asp.Net中NHiernate的Session的管理

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

From:http://tw.wingwit.com/Article/program/net/201311/12369.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.