国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET 數(shù)據(jù)庫緩存依賴

2024-07-10 12:57:51
字體:
供稿:網(wǎng)友
注冊會員,創(chuàng)建你的web開發(fā)資料庫,asp.net 數(shù)據(jù)庫緩存依賴


by peter a. bromberg, ph.d.

在asp.net中,cache類最酷的特點是它能根據(jù)各種依賴來良好的控制自己的行為。以文件為基礎(chǔ)的依賴是最有用的,文件依賴項是通過使用 cache.insert 并提供引用文件的 cachedependency 對象添加的



cache.insert("mydata", source, new cachedependency(server.mappath("authors.xml")));



但是當我們想讓緩存根據(jù)數(shù)據(jù)庫中表的變化而失效并重建該緩存的時候,應該怎么做呢 – 這種情景在很多應用程序中都存在。asp.net沒有為監(jiān)視數(shù)據(jù)庫表的變化提供內(nèi)在的直接緩存支持。利用sql server的不常用的系統(tǒng)存儲過程sp_makewebtask ,是可以達到這個目的的,這個存儲過程本來是用作從查詢中生成web頁面的,但是我們只要稍作修改- 在觸發(fā)器中使用它,我們就可以取得一個合理有效的途徑,當數(shù)據(jù)庫某張表的記錄被更新,刪除或者修改時來修改某個特定的文件, 這樣會使在cachedependency實例中的文件監(jiān)視進程偵測到文件的變化,從而使緩存失效。事實上,因為cachedependency 類工作在unc文件協(xié)議上,我們可以在整個web farm上部署這個解決方案,web farm上每臺機器上的應用程序副本都會通過unc文件路徑來監(jiān)視webfarm中某臺單個機器上的同一個文件

廢話少說,讓我們創(chuàng)建一個簡單的web應用程序,來演示它是如果工作的。首先,我們將會使用我們sql server中都信賴的northwind范例數(shù)據(jù)庫。創(chuàng)建一個簡單的datagrid來顯示employees表中的記錄. 我們要做的第一件事情就是創(chuàng)建觸發(fā)器。

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表發(fā)生任何變動,就根據(jù)一個簡單的查詢來更新”mycache.txt”文件,有這個簡單的查詢語句其實足夠了,只要它是一個有效的t-sql語句,sql server會很樂意的去更新那個文件。

接下來,我們需要創(chuàng)建一個目錄,并設(shè)為共享。你可能要更新該文件的訪問權(quán)限,以使它可以被寫入,注意,我這里使用的是管理員共享”c$”.另外,你還需要創(chuàng)建一個空的文本文件,"mycache.txt".

好,現(xiàn)在可以創(chuàng)建我們的應用程序了。首先,在web.config文件中輸入依賴文件名稱,這樣做可以使我們在修改依賴文件的時候不需要重新部署應用程序。

在web.config文件的根部,添加appsettings配置節(jié):

</system.web>

<appsettings>

<!—緩存依賴文件路徑 -->

<add key="dependencyfile" value="//peter/cache/mycache.txt" />

</appsettings>

</configuration>



現(xiàn)在,讓我們在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實例賦給它,然后調(diào)用refreshcache方法去填充該對象。refreshcache實際上是一個靜態(tài)的委托回調(diào)方法,它所做的就是簡單的從empoyees表中取得一個dataset,然后創(chuàng)建cacheitemremovedcallback類型的委托onremove,使其指向refreshcache方法,這樣當被監(jiān)控的文件變化時,也就是緩存失效時,就會調(diào)用該委托,刷新緩存中的數(shù)據(jù)。

最后我們把dataset連同onremove委托一起插入到緩存中,在session_start中,為了“保險“,我另外添加了一個判斷來調(diào)用refreshcache方法填充緩存。

到這里,我們應用程序就創(chuàng)建好了,在任何頁面中都可以訪問到緩存的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();

}



現(xiàn)在,如果你請求這個頁面,它將會每次成功的顯示從從cache中取得的dataset,如果你保持瀏覽器打開,同時打開sql server的查詢分析器,選擇northwind數(shù)據(jù)庫,執(zhí)行sql語句'update employees set lastname = 'davovlieu' where employeeid =1',更新表中的記錄,然后重新請求該頁面,你將會看到緩存已經(jīng)失效并刷新。

譯者按:關(guān)于基于數(shù)據(jù)庫的緩存依賴,gotdotnet上也有一個用dataset實現(xiàn)的(rob howard 實現(xiàn)) asp.net cache invalidation on database change,

目前在asp.net1.1版本沒有非常自然的解決方案,值得欣慰的是,隨whidbey一起發(fā)布的asp.net2.0,還有yuku,從數(shù)據(jù)層提供了一個不錯的實現(xiàn)。讓我們拭目以待!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 蒙自县| 垣曲县| 曲阳县| 茌平县| 怀化市| 酒泉市| 油尖旺区| 彭州市| 尚志市| 神木县| 商都县| 榆林市| 诸暨市| 乌兰察布市| 平乡县| 常熟市| 庆城县| 江西省| 大同市| 开江县| 常宁市| 衢州市| 庄浪县| 张家口市| 巴中市| 秦安县| 旬邑县| 临泉县| 郧西县| 金堂县| 抚州市| 彭泽县| 广平县| 青海省| 罗甸县| 怀安县| 怀远县| 延津县| 遂川县| 万州区| 鹤庆县|