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

ASP.NET 數據庫緩存依賴

2013-11-13 10:25:21  來源: .NET編程 

  在ASPNET中Cache類最酷的特點是它能根據各種依賴來良好的控制自己的行為以文件為基礎的依賴是最有用的文件依賴項是通過使用 CacheInsert 並提供引用文件的 CacheDependency 對象添加的
  
  CacheInsert(MyData Source new CacheDependency(ServerMapPath(authorsxml)));
  
  但是當我們想讓緩存根據數據庫的變化而失效的時候應該怎麼做呢 – 這種情景在很多應用程序中都存在沒有為監視數據庫表的變化提供內在的直接緩存支持利用SQL Server的不常用的系統存儲過程sp_makewebtask 是可以達到這個目的的這個存儲過程本來是用作從查詢中生成web頁面的但是我們只要稍作修改 在觸發器中使用它我們就可以取得一個合理有效的途徑當數據庫某張表的記錄被更新刪除或者修改時來修改某個特定的文件 這樣會使在CacheDependency實例中的文件監視進程偵測到文件的變化從而使緩存失效事實上因為CacheDependency 類工作在UNC文件協議上我們可以在整個Web Farm上部署這個解決方案Web Farm上每台機器上的應用程序副本都會通過UNC文件路徑來監視WebFarm中某台單個機器上的同一個文件
  
  廢話少說讓我們創建一個簡單的web應用程序來演示它是如果工作的首先我們將會使用我們SQL Server中都信賴的Northwind范例數據庫創建一個簡單的DataGrid來顯示Employees表中的記錄 我們要做的第一件事情就是創建觸發器
  
  CREATE TRIGGER WriteCacheDepFile ON [dbo][Employees]
  FOR INSERT UPDATE DELETE
  AS
  EXEC sp_makewebtask \\peter\C$\Cache\mycachetxt SELECT top FirstName FROM employees
  
  以上存儲過程就是簡單的告訴SQL Server如果Employee表發生任何變動就根據一個簡單的查詢來更新mycachetxt文件有這個簡單的查詢語句其實足夠了只要它是一個有效的TSQL語句SQL Server會很樂意的去更新那個文件
  
  接下來我們需要創建一個目錄並設為共享你可能要更新該文件的訪問權限以使它可以被寫入注意我這裡使用的是管理員共享C$另外你還需要創建一個空的文本文件mycachetxt
  
  好現在可以創建我們的應用程序了首先在nfig文件中輸入依賴文件名稱這樣做可以使我們在修改依賴文件的時候不需要重新部署應用程序
  
  在nfig文件的根部添加appSettings配置節
  

  現在讓我們在Global類中建立緩存機制這樣我們不需要在任何頁面中編寫特定的代碼
  
  [C#]

  public class Global : SystemWebHttpApplication

  {

  Cache _cache =null;

  public static bool blnReflash = false;

  public const string ConnStr = server=localhost;database=Northwind;uid=sa;pwd=;

  public const string strSQL = SELECT EmployeeID lastname firstname FROM
  Employees;

  protected void Application_Start(Object sender EventArgs e)

  {

  _cache = ContextCache;

  RefreshCahe(nullnullnull);

  }

  protected void Session_Start(Object sender EventArgs e)

  {

  if(HttpContextCurrentCache[Employees]==null)

  RefreshCache(nullnull);

  }

  static void RefreshCache(string keyobject itemCacheItemRemoveReason reason)

  {

  SqlDataAdapter adapter = new SqlDataAdapter(strSQLConnStr);

  DataSet ds = new DataSet();

  adapterFill(dsEmployees);

  CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(RefreshCache);

  string depFile= ConfigurationSettingsAppSettings[dependencyFile]ToString();

  HttpContextCurrentCacheInsert(Employeesdsnew CacheDependency(depFile)

  CacheNoAbsoluteExpirationCacheNoSlidingExpiration

  CacheItemPriorityHighonRemove);

  blnReflash = true;

  }

  }
  
  就像上面看到的一樣我們定義了一個Cache類型的_cache對象在Application_Start方法中我們把當前的Cache實例賦給它然後調用RefreshCache方法去填充該對象RefreshCache實際上是一個靜態的委托回調方法它所做的就是簡單的從Empoyees表中取得一個DataSet然後創建CacheItemRemovedCallback類型的委托OnRemove使其指向RefreshCache方法這樣當被監控的文件變化時也就是緩存失效時就會調用該委托刷新緩存中的數據
  
  最後我們把DataSet連同OnRemove委托一起插入到緩存中在Session_Start中為了保險我另外添加了一個判斷來調用RefreshCache方法填充緩存
  
  到這裡我們應用程序就創建好了在任何頁面中都可以訪問到緩存的DataSet在WebFormaspx中我演示了如何使用它
  
  [C#]
  private void Page_Load(object sender SystemEventArgs e)
  
  {
  
  //保證緩存非空如果為空則填充它
    if(Cache[Employees] == null)
       cacheStatusText = Cache Refreshed at + DateTimeNowToLongTimeString();
    else
       cacheStatusText = DataSet from Cache ;
    DataSet ds = (DataSet)Cache[Employees];
    DataGridDataSource= dsTables[];
    DataGridDataBind();
  }
  
  現在如果你請求這個頁面它將會每次成功的顯示從從Cache中取得的DataSet如果你保持浏覽器打開同時打開SQL Server的查詢分析器選擇Northwind數據庫執行SQL語句Update Employees set Lastname = Davovlieu where EmployeeID =更新表中的記錄然後重新請求該頁面你將會看到緩存已經失效並刷新
  
  譯者按關於基於數據庫的緩存依賴gotdotnet上也有一個用DataSet實現的(Rob Howard 實現) ASPNET Cache Invalidation on Database Change
  
  目前在ASPNET版本沒有非常自然的解決方案值得欣慰的是隨Whidbey一起發布的ASPNET還有Yuku從數據層提供了一個不錯的實現讓我們拭目以待!
  
  下面的工程是Visual StudioNET 格式
  
  下載本文工程
From:http://tw.wingwit.com/Article/program/net/201311/13571.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.