ASP.NET 資料庫緩衝依賴

來源:互聯網
上載者:User
asp.net|緩衝|資料|資料庫 ASP.NET 資料庫緩衝依賴


By Peter A. Bromberg, Ph.D.

在ASP.NET中,Cache類最酷的特點是它能根據各種依賴來良好的控制自己的行為。以檔案為基礎的依賴是最有用的,檔案依賴項是通過使用 Cache.Insert 並提供引用檔案的 CacheDependency 對象添加的



Cache.Insert("MyData", Source, new CacheDependency(Server.MapPath("authors.xml")));



但是當我們想讓緩衝根據資料庫中表的變化而失效並重建該緩衝的時候,應該怎麼做呢 – 這種情景在很多應用程式中都存在。Asp.net沒有為監視資料庫表的變化提供內在的直接緩衝支援。利用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\mycache.txt', 'SELECT top 1 FirstName FROM employees'



以上預存程序就是簡單的告訴SQL Server,如果Employee表發生任何變動,就根據一個簡單的查詢來更新”mycache.txt”檔案,有這個簡單的查詢語句其實足夠了,只要它是一個有效T-SQL語句,SQL Server會很樂意的去更新那個檔案。

接下來,我們需要建立一個目錄,並設為共用。你可能要更新該檔案的存取權限,以使它可以被寫入,注意,我這裡使用的是管理員共用”C$”.另外,你還需要建立一個空的文字檔,"mycache.txt".

好,現在可以建立我們的應用程式了。首先,在web.config檔案中輸入依賴檔案名稱,這樣做可以使我們在修改依賴檔案的時候不需要重新部署應用程式。

在web.config檔案的根部,添加appSettings配置節:

</system.web>

<appSettings>

<!—緩衝依賴檔案路徑 -->

<add key="dependencyFile" value="\\peter\Cache\mycache.txt" />

</appSettings>

</configuration>



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


[C#]

public class Global : System.Web.HttpApplication

{

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 = Context.Cache;

RefreshCahe(null,null,0);

}



protected void Session_Start(Object sender, EventArgs e)

{

if(HttpContext.Current.Cache["Employees"]==null)

RefreshCache(null,null,0);

}



static void RefreshCache(string key,object item,CacheItemRemoveReason reason)

{

SqlDataAdapter adapter = new SqlDataAdapter(strSQL,ConnStr);

DataSet ds = new DataSet();

adapter.Fill(ds,"Employees");

CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(RefreshCache);



string depFile= ConfigurationSettings.AppSettings["dependencyFile"].ToString();

HttpContext.Current.Cache.Insert("Employees",ds,new CacheDependency(depFile),

Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration,

CacheItemPriority.High,onRemove);



blnReflash = true;

}

}



就像上面看到的一樣,我們定義了一個Cache類型的_cache對象,在Application_Start方法中,我們把當前的Cache執行個體賦給它,然後調用RefreshCache方法去填充該對象。RefreshCache實際上是一個靜態委託回調方法,它所做的就是簡單的從Empoyees表中取得一個DataSet,然後建立CacheItemRemovedCallback類型的委託OnRemove,使其指向RefreshCache方法,這樣當被監控的檔案變化時,也就是緩衝失效時,就會調用該委託,重新整理緩衝中的資料。

最後我們把DataSet連同OnRemove委託一起插入到緩衝中,在Session_Start中,為了“保險“,我另外添加了一個判斷來調用RefreshCache方法填充緩衝。

到這裡,我們應用程式就建立好了,在任何頁面中都可以訪問到緩衝的DataSet。在WebForm1aspx中,我示範了如何使用它。

[C#]

private void Page_Load(object sender, System.EventArgs e)

{

//保證緩衝非空,如果為空白,則填充它

if(Cache["Employees"] == null)

Global.RefreshCache(null,null, 0);

cacheStatus.Text = "Cache Refreshed at "+ DateTime.Now.ToLongTimeString();

else

cacheStatus.Text = " DataSet from Cache ";



DataSet ds = (DataSet)Cache["Employees"];

DataGrid1.DataSource= ds.Tables[0];

DataGrid1.DataBind();

}



現在,如果你請求這個頁面,它將會每次成功的顯示從從Cache中取得的DataSet,如果你保持瀏覽器開啟,同時開啟SQL Server的查詢分析器,選擇Northwind資料庫,執行SQL語句'Update Employees set Lastname = 'Davovlieu' where EmployeeID =1',更新表中的記錄,然後重新請求該頁面,你將會看到緩衝已經失效並重新整理。

譯者按:關於基於資料庫的緩衝依賴,gotdotnet上也有一個用DataSet實現的(Rob Howard 實現) ASP.NET Cache Invalidation on Database Change,

目前在ASP.NET1.1版本沒有非常自然的解決方案,值得欣慰的是,隨Whidbey一起發布的ASP.NET2.0,還有Yuku,從資料層提供了一個不錯的實現。讓我們拭目以待!




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.