强大的SqlCacheDependency
最近我在忙于研究負(fù)載平衡、并發(fā)性容錯性等性能優(yōu)化問題,ASP.NET有太多強大的功能等待學(xué)習(xí)和挖掘。今天,Bosnma和大家一起研究在ASP.NET中緩存機制如何幫助我們在高流量網(wǎng)站中減少服務(wù)器負(fù)擔(dān)。
何為緩存????????? 緩存無處不在,尤其是流量較高的網(wǎng)站。對于某些頁面(尤其是帶有一個或更多數(shù)據(jù)庫操作的頁面)可能會對數(shù)據(jù)庫服務(wù)器帶來過大的負(fù)載,而這些負(fù)載經(jīng)常是不必要的。比如某公司的商品清單頁面可能在一個小時,一天甚至更長時間并未改變,遺憾的是每一個瀏覽該頁面的用戶都會造成數(shù)據(jù)庫的連接及查詢。緩存就是為了解決這樣的問題應(yīng)運而生。緩存的簡單實現(xiàn)?????????? 在ASP.NET中實現(xiàn)緩存的最簡單的方法就是在頁面上加一個OutputCache標(biāo)簽。<% @ OutputCache Duration ="20" VaryByParam ="*" %>???? 其中Duration指定了緩存的過期時間。上面的句子表示該頁面的數(shù)據(jù)庫查詢操作在20秒內(nèi)會自動保存到緩存中,不再重復(fù)連接數(shù)據(jù)庫,在高流量的網(wǎng)站中大大減輕了數(shù)據(jù)庫的負(fù)載。沒有免費午餐????????? PageCache簡單好用,可是有點小小的問題。例如在一個論壇中的首頁往往都會用到PageCache,這樣最新發(fā)表的帖子不會立即顯示在首頁上,而是需要等待一段時間(緩存過期)后才會出現(xiàn),而這種延遲在某些場合是完全不允許的。比如購物商城的網(wǎng)站,某人已經(jīng)訂購了最后一批貨物,而由于緩存機制,其他人查看狀態(tài)時依然是訂購前的(未被訂購),我想你不會希望兩個人買你僅有的一件商品。ASP.NET里面的Cache并不能自動根據(jù)數(shù)據(jù)庫中相應(yīng)數(shù)據(jù)發(fā)生了變化,而使相應(yīng)的Cache過期,ASP.NET 2.0中新增的SqlCacheDependency特性使這成為了可能。我們今天的主題就此引出。強大的SqlCacheDependency?SqlCacheDependency在保證更新同步的前提下通過緩存減小數(shù)據(jù)庫負(fù)載。那么如何使用它呢?1、 使數(shù)據(jù)庫支持SqlCacheDependency?在.Net Framework 2.0 的安裝目錄下(通常是WINDOWS\Microsoft.NET\Framework\v2.0.XXXXX),有一個aspnet_regsql.exe,這個命令行工具可以幫助我們使數(shù)據(jù)庫支持SqlCacheDependency特性,
首先:“aspnet_regsql? –S 服務(wù)器名 –U 登陸名 ID –P 密碼 –d 數(shù)據(jù)庫名? –ed”,這個命令使指定數(shù)據(jù)庫支持SqlCacheDependency,??然后我們再加入要追蹤的數(shù)據(jù)表:“aspnet_regsql –S 服務(wù)器名? –U 登陸名 ID –P 密碼 –d 數(shù)據(jù)庫名 –t 追蹤的數(shù)據(jù)表 –et”,這個命令使指定的Table支持SqlCacheDependency。?指令運行后,在指定的數(shù)據(jù)庫中會新建一個Table,叫做“AspNet_SqlCacheTablesForChangeNotification”,這個表有三個字段,“tableName”記錄要追蹤的數(shù)據(jù)表的名稱,“notificationCreated”記錄開始追蹤的時間,“changeId”是一個int類型的字段,每當(dāng)追蹤的數(shù)據(jù)表的數(shù)據(jù)發(fā)生變化時,這個字段的值就加1。?它還會在指定的數(shù)據(jù)庫中增加幾個存儲過程,用來讓ASP.NET引擎查詢追蹤的數(shù)據(jù)表的情況。?然后,它會給我們要追蹤的Table加上幾個Trigger,分別對應(yīng)到Insert、Update、Delete操作,這幾個Trigger的語句非常簡單,就是把“AspNet_SqlCacheTablesForChangeNotification”表中對應(yīng)“tableName”字段為這個追蹤的表的名稱的記錄的“changeId”字段加上一個1。?ASP.NET引擎通過執(zhí)行它加上的存儲過程“AspNet_SqlCachePollingStoredProcedure”,這個存儲過程直接返回“AspNet_SqlCacheTablesForChangeNotification”表的內(nèi)容,讓ASP.NET引擎知道哪個表的數(shù)據(jù)發(fā)生的變化。默認(rèn)每500毫秒執(zhí)行這個存儲過程一次,不過可以在web.config里面修改這個間隔時間。
2、 web.config配置?? < system.web >???? <!-- 配置Cache 結(jié)點 , 使網(wǎng)站 支持SqlCacheDependency -->???? < cache >?????? < sqlCacheDependency enabled = " true " pollTime = " 500 " >???????? < databases >?????????? < add name = " CacheDB " connectionStringName = " CS " />???????? </ databases >?????? </ sqlCacheDependency >???? </ cache >?</ system.web >?3、 在頁面上的outputCache標(biāo)簽中指定SqlCacheDependency特性:?<% @ OutputCache Duration ="9999" VaryByParam ="None" SqlDependency ="CacheDB:TableName" %>?其中TableName為追蹤的表名,只要在這個追蹤的Table上執(zhí)行了Insert、Update、Delete操作,數(shù)據(jù)表上的Trigger就會將數(shù)據(jù)庫中“ AspNet_SqlCacheTablesForChangeNotification”表的相應(yīng)記錄的相應(yīng)“changId”字段值修改,然后ASP.NET 引擎就會通過獲取新的值來得知追蹤的Table的內(nèi)容發(fā)生了變化,自動使這個頁面的cache失效?最后???????? 同樣的網(wǎng)站,同樣的功能,在 安全性 、 并發(fā)性 、 容錯性 很多方面都會有所不同,而網(wǎng)站的好壞并不是看他有多少花哨的功能或多么華麗的界面,而是他是否實用、穩(wěn)定、效率、安全。 ASP.NET 博大精深,看來好多東西,都是“越學(xué)越淺”的。
總結(jié)
以上是生活随笔為你收集整理的强大的SqlCacheDependency的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 叮当应急上征信吗
- 下一篇: 自动ping博客服务程序