[ASP.NET] ObjectDataSource of Cache

Cache 對岸翻成緩存,我們翻成快取。
對於一些不常變化的資料,我們會將他暫存下來,暫存的方式有很多,這裡要提的是 DataSource Control,它本身就提供了快取功能,它
 

  • 它支援資料庫更新自動重新取得新資料,SQL Cache。 
  •  .NET 提供了好多種 DataSource Control,參考:https://msdn.microsoft.com/en-us/library/ms227679%28v=vs.100%29.aspx,我最常用的是 ObjectDataSource,我只需要它能幫我綁定前端的資料,沒有太大意外的話我應該也只會選這個
  • 它的快取機制相當的聰明,它會決定是否要觸發後端事件並取得新資料,舉個例子,按下F5會從後端重新載入資料,然後 Render 畫面,用了 ObjectDataSource 的快取之後,它會決定要不要回後端。 
Note:Cache會依伺服器記憶體資源而決定是否拋棄

本文開始:

這裡只會針對重點介紹,開始之前,若你不會用 ObjectDataSource,可以參考
    http://www.dotblogs.com.tw/yc421206/archive/2014/11/13/147293.aspx
    http://www.dotblogs.com.tw/yc421206/archive/2014/11/13/147293.aspx
 

快取流程:

快取資料後, ObjectDataSource.SelectMethod 會從快取拿資料。快取過期時,ObjectDataSource 才會觸發 對應的後端 SelectMethod 重新拿資料,資料拿到後再放置快取

  • EnableCaching=true,就會開始進行快取流程快取。
  • ObjectDataSource.CacheDuration:快取時間,單位 "秒",0 表示無限大
  • ObjectDataSource.CacheExpirationPolicy:快取過期策略,有絕對過期(Absolute)和彈性過期(Sliding)
  • 絕對過期:快取時間終止後,重新拿資料
  • 彈性過期:快取時間截止前,只要有人使用快取,就會延長過期時間
  • 請依自己的需求決定要採用何種過期策略

 
快取共享:

只要 ObjectDataSource 的屬性TypeName、SelectMethod、SelectParameters 配置相同,就可以在多個頁面共享相同的快取資料

CacheKeyDependency:

ObjectDataSource 也可以依賴別的 Cache 物件,這個屬性存放的是 Cache 的 Key Name,一旦依賴的快取內容改變了,ObjectDataSource 會觸發對應的後端 SelectMethod 重新拿資料

Note:個人常用的組合為CacheKeyDependency + ObjectDataSource.CacheExpirationPolicy.Sliding

 @.aspx:
    在各個頁面定義 ObjectDataSource,其中 CacheKeyDependency="Employee" 表示相依名為"Employee" 的 Cache 物件

<asp:ObjectDataSource ID="Master_ObjectDataSource" runat="server"
	DataObjectTypeName="Simple.RadGridForObjectDataSOurce.Employee"
	TypeName="Simple.RadGridForObjectDataSOurce.EmployeeDataSourceManager"
	SelectCountMethod="GetEmployeeCount"
	SelectMethod="GetEmployees"
	StartRowIndexParameterName="startRowIndex"
	MaximumRowsParameterName="maximumRows"
	SortParameterName="sortExpressions"
	OldValuesParameterFormatString="original_{0}"
	OnSelecting="Master_ObjectDataSource_Selecting"
	EnablePaging="True"
	EnableCaching="true"
	CacheDuration="1200"
	CacheExpirationPolicy="Sliding"
	CacheKeyDependency="Employee">
	<SelectParameters>
		<asp:Parameter Name="maximumRows" Type="Int32" />
		<asp:Parameter Name="startRowIndex" Type="Int32" />
		<asp:Parameter Name="sortExpressions" Type="String" ConvertEmptyStringToNull="true" />
		<asp:Parameter Name="filterExpressions" Type="String" ConvertEmptyStringToNull="true" />
	</SelectParameters>
</asp:ObjectDataSource>

   
@Global.asax.cs:

在應用程式建立起來的時候,我建立了一個永不過期的 Cache["Employee"] 快取物件,裡面存放了 DateTime.Now

    Note:這個內容並不重要,只要變更快取內容,就會重新取得 ObjectDataSource 的快取
protected void Application_Start(object sender, EventArgs e)
{
	HttpContext.Current.Cache.Insert(
		"Employee",
		DateTime.Now,
		null,
		DateTime.MaxValue,
		Cache.NoSlidingExpiration,
		CacheItemPriority.Default,
		null);
}

    
@BLL or DAL:

最後,就是要選在對的時機點改變 Cache["Employee"] 的內容,比如在:新增、更新、刪除區段;一旦 Cache["Employee"] 的內容變了就會觸發 ObjectDataSource.SelectMethod 重新拿資料。

HttpContext.Current.Cache["Employee"] = DateTime.Now;

結論:

善用快取能夠有效提升應用程式效能,降低伺服器資源,只用是從應用程式面所做的資料異動,都可以輕鬆的管理快取,但,如果有人直接把手到資料庫呢?在三層式架構,商業邏輯的流程控制、檢查機制,是寫在應用程式的BLL裡面,而不是寫在資料庫的預存程式和Tigger裡,以一個穩定三層式架構的系統,理當應禁止開發人員直接異動資料庫,以免發生資料錯誤的情況;但如果真的要直接異動資料庫(雖然不建議),ObjectDataSource 仍可使用 SqlCacheDependency 屬性 + SQL Cahce 來處理快取更新機制

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo