Asp.Net中NHiernate的Session的管理_實用技巧

來源:互聯網
上載者:User

  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,這樣效率不是更好?!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.