而在asp.net 1.1 中,已經(jīng)比較好地實(shí)現了數據的緩存功能,但有一個(gè)小問(wèn)題,那就是如果數據庫中的數據發(fā)生了變化,緩存不能在指定的時(shí)間內更新,而必須等到緩存失效。比如,在網(wǎng)頁(yè)中,如果你對商品的一些詳細信息,如價(jià)格等使用了頁(yè)面緩存,那么假如在后臺修改了這些信息,用戶(hù)不會(huì )馬上看到這些信息,而要延遲一些時(shí)間才看到。在某些應用場(chǎng)合,如果你要做到對于數據庫的任何更新,都能馬上可以在緩存的變化生效的話(huà),在asp.net 1.1中則是比較難實(shí)現的,而在asp.net 2.0中,則可以很方便地實(shí)現該功能。本文將以.net Framework 2.0 beta,visual web developer express beta ,來(lái)介紹該功能的實(shí)現。
首先,在asp.net 2.0中,針對sql server 7/2000,以及即將發(fā)行的sql server 2005(Yukon),分別提供了新的緩存功能。這里著(zhù)重介紹針對sql server 7/2000的緩存功能。這個(gè)新的數據緩存功能,叫做SqlCacheDependency,要實(shí)現該功能,需要采用如下步驟:
1、在.net framework 2.0的安裝目錄下
?。J是WINNT\Microsoft.NET\Framework\v2.0.40607),啟動(dòng)一個(gè)叫aspnet_regsql.exe的命令行工具,比如:
aspnet_regsql -S localhost –U sa –P 123456 -d Pubs –ed
上面的意思是,指定了本地的數據庫服務(wù)器localhost,并指定了登陸的用戶(hù)名和密碼,并用參數-d指定了要采用哪一個(gè)數據庫(這里是指定了pubs)數據庫,-ed參數表示是允許該數據庫使用sqlcachedependency功能。
接著(zhù),我們需要指定對哪一個(gè)表使用數據sqlcachedependency功能,如:
aspnet_regsql -S localhost –U sa -P 123456 -ed -d pubs -et -t authors
上面語(yǔ)句的意思是,指定對pubs數據庫中的authors表使用sqlcachedependency功能,-t參數后是表的名稱(chēng),-et是允許該表使用sqlcachedependency功能。其他的有關(guān)參數簡(jiǎn)單介紹如下:
| 參數 | 參數意義 |
| -? | 顯示該工具的幫助功能. |
| -S | 后接的參數為數據庫服務(wù)器的名稱(chēng)或者IP地址 |
| -U | 后接的參數為數據庫的登陸用戶(hù)名. |
| -P | 后接的參數為數據庫的登陸密碼 |
| -E | 當使用windows集成驗證時(shí),使用該功能 |
| -t | 后接參數為對哪一個(gè)表采用sqlcachedependency功能。 |
| -d | 后接參數為對哪一個(gè)數據庫采用sqlcachedependency功能 |
| -ed | 允許對數據庫使用sqlcachedependency功能 |
| -dd | 禁止對數據庫采用sqlcachedependency功能 |
| -et | 允許對數據表采用sqlcachedependency功能 |
| -dt | 禁止對數據表采用sqlcachedependency功能 |
| -lt | 列出當前數據庫中有哪些表已經(jīng)采用sqlcachedependency功能 |
Sqlcachedependency的的原理簡(jiǎn)單來(lái)說(shuō),是采用aspnet_regsql這個(gè)專(zhuān)門(mén)工具,預先設定要監視的數據庫和表,并在數據庫中增加一個(gè)專(zhuān)門(mén)的表,打開(kāi)數據庫,會(huì )發(fā)現多了一個(gè)數據表aspnet_sqlcachetablesforchangenotification,如下圖:

這個(gè)表有三個(gè)字段,“tableName”記錄要追蹤的數據表的名稱(chēng),“notificationCreated”記錄開(kāi)始追蹤的時(shí)間,“changeId”是一個(gè)int類(lèi)型的字段,每當追蹤的數據表的數據發(fā)生變化時(shí),這個(gè)字段的值就加1。 此外還會(huì )在指定的數據庫中增加幾個(gè)存儲過(guò)程,用來(lái)讓ASP.NET引擎查詢(xún)追蹤的數據表的情況,并給要使用 Sqlcachedependency 的表加上若干觸發(fā)器,分別對應到Insert、Update、Delete操作。ASP.NET引擎通過(guò)執行它加上的存儲過(guò)程“AspNet_SqlCachePollingStoredProcedure”,這個(gè)存儲過(guò)程直接返回“AspNet_SqlCacheTablesForChangeNotification”表的內容,讓ASP.NET引擎知道哪個(gè)表的數據發(fā)生的變化。
接下來(lái),我們用visual web developer 2005 beta,來(lái)創(chuàng )建一個(gè)website,往其中增加一個(gè)label標簽,以顯示當前執行的時(shí)間。并往其中增加一個(gè)gridview控件,用來(lái)顯示來(lái)自pubs數據庫的表authors,代碼如下:
<%@ Page Language="VB" AutoEventWireup="false" CompileWith="Default.aspx.vb" ClassName="Default_aspx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:Label ID="Label1" Runat="server" Text="Label" Width="74px" Height="19px"></asp:Label>
<br />
<asp:GridView ID="GridView1" Runat="server" DataSourceID="SqlDataSource1">
</asp:GridView>
<br />
<br />
<asp:SqlDataSource ID="SqlDataSource1" Runat="server" SelectCommand="SELECT * FROM authors"
ConnectionString="Initial Catalog=pubs;Data Source=localhost;user id=sa;password=123456">
</asp:SqlDataSource>
</form>
</body>
</html>
在default.aspx.vb的代碼的page_load事件中,加入以下代碼
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Label1.Text = CType(System.DateTime.Now(), String)
End Sub
接下來(lái),我們開(kāi)始配置web.config文件。我們采用的配置文件如下:
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="PubsConn" connectionString="Initial Catalog=pubs;Data Source=(local);user id=sa;password=123456"/>
</connectionStrings>
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="500">
<databases>
<add name="Pubs" connectionStringName="PubsConn"/>
</databases>
</sqlCacheDependency>
</caching>
</system.web>
</configuration>
其中,要注意的是polltime參數,polltime參數是毫秒,最小值為500,該參數的意義時(shí)設置系統多長(cháng)時(shí)間去檢查一次cache中的數據是否需要更新。而<database>標簽內必須注明需要用到的數據庫連接字符串,必須和之前<connectionStrings>中定義的名稱(chēng)相符合(如本例中,connectionstring的名稱(chēng)是pubsconn。
最后,我們在程序的首部,加入頁(yè)面緩存的定義語(yǔ)句如下:
?。?@ outputcache duration="60" varybyparam="none" sqldependency="Pubs:authors" %>
上面的語(yǔ)句,則定義了頁(yè)面輸出緩存為1分鐘,并且使用sqldependency,sqldependency的屬性中,以“名稱(chēng):表名”的形式定義,其中的名稱(chēng),就是剛才我們在web.config中定義的<databases>中的名稱(chēng),這里是pubs。“Pubs:authors”中的authors,則是要使用sqldependency的表名authors表。在這里要注意的是,雖然我們是用vb.net,但sqldependency屬性中的參數注定是大小寫(xiě)敏感的,如“Pubs:authors”中的表名authors必須和用Aspnet_regsql在命令行下定義的表名authors一樣。
運行我們的程序,先不修改數據庫中的數據。如下圖:

我們不斷刷新該應用,會(huì )發(fā)現由于使用了緩存功能,上面的時(shí)間是不變的?,F在我們打開(kāi)sql server,修改其中的au_id為172-32-1176的作者名white,將其改為RED,之后再刷新程序,看到了么?由于使用了sqldependency的功能,馬上緩存中反映出新修改的數據了:

本文簡(jiǎn)單介紹了在asp.net 2.0中新增加的sqldependency功能,該功能還有很多其他的應用,具體的可以參閱msdn相關(guān)資料。
聯(lián)系客服