在ASP.NET 2.0,新增加了不少新的功能和控制項。其中,在資料的緩衝功能,比asp.net 1.1有了很大的改變。眾所周知,資料的緩衝功能是十分重要的,我們可以把一些在相對一段時間內不發生改變的資料放在緩衝中,這樣,就不必要每次去讀取資料庫,當下次再需要這些資料時,可以直接從緩衝中取得,大大增強了效率。
而在asp.net 1.1 中,已經比較好地實現了資料的緩衝功能,但有一個小問題,那就是如果資料庫中的資料發生了變化,緩衝不能在指定的時間內更新,而必須等到緩衝失效。比如,在網頁中,如果你對商品的一些詳細資料,如價格等使用了頁面緩衝,那麼假如在後台修改了這些資訊,使用者不會馬上看到這些資訊,而要延遲一些時間才看到。在某些應用場合,如果你要做到對於資料庫的任何更新,都能馬上可以在緩衝的變化生效的話,在asp.net 1.1中則是比較難實現的,而在asp.net 2.0中,則可以很方便地實現該功能。本文將以.net Framework 2.0 beta,visual web developer express beta ,來介紹該功能的實現。
首先,在asp.net 2.0中,針對sql server 7/2000,以及即將發行的sql server 2005(Yukon),分別提供了新的緩衝功能。這裡著重介紹針對sql server 7/2000的緩衝功能。這個新的資料緩衝功能,叫做SqlCacheDependency,要實現該功能,需要採用如下步驟:
1、在.net framework 2.0的安裝目錄下
(預設是WINNT\Microsoft.NET\Framework\v2.0.40607),啟動一個叫aspnet_regsql.exe的命令列工具,比如:
aspnet_regsql -S localhost –U sa –P 123456 -d Pubs –ed
上面的意思是,指定了本地的資料庫伺服器localhost,並指定了登陸的使用者名稱和密碼,並用參數-d指定了要採用哪一個資料庫(這裡是指定了pubs)資料庫,-ed參數表示是允許該資料庫使用sqlcachedependency功能。
接著,我們需要指定對哪一個表使用資料sqlcachedependency功能,如:
aspnet_regsql -S localhost –U sa -P 123456 -ed -d pubs -et -t authors
上面語句的意思是,指定對pubs資料庫中的authors表使用sqlcachedependency功能,-t參數後是表的名稱,-et是允許該表使用sqlcachedependency功能。其他的有關參數簡單介紹如下:
| 參數 |
參數意義 |
| -? |
顯示該工具的協助功能. |
| -S |
後接的參數為資料庫伺服器的名稱或者IP地址 |
| -U |
後接的參數為資料庫的登陸使用者名稱. |
| -P |
後接的參數為資料庫的登陸密碼 |
| -E |
當使用windows整合驗證時,使用該功能 |
| -t |
後接參數為對哪一個表採用sqlcachedependency功能。 |
| -d |
後接參數為對哪一個資料庫採用sqlcachedependency功能 |
| -ed |
允許對資料庫使用sqlcachedependency功能 |
| -dd |
禁止對資料庫採用sqlcachedependency功能 |
| -et |
允許對資料表採用sqlcachedependency功能 |
| -dt |
禁止對資料表採用sqlcachedependency功能 |
| -lt |
列出當前資料庫中有哪些表已經採用sqlcachedependency功能 |
Sqlcachedependency的的原理簡單來說,是採用aspnet_regsql這個專門工具,預先設定要監視的資料庫和表,並在資料庫中增加一個專門的表,開啟資料庫,會發現多了一個資料表aspnet_sqlcachetablesforchangenotification,如:
這個表有三個欄位,“tableName”記錄要追蹤的資料表的名稱,“notificationCreated”記錄開始追蹤的時間,“changeId”是一個int類型的欄位,每當追蹤的資料表的資料發生變化時,這個欄位的值就加1。 此外還會在指定的資料庫中增加幾個預存程序,用來讓ASP.NET引擎查詢追蹤的資料表的情況,並給要使用 Sqlcachedependency 的表加上若干觸發器,分別對應到Insert、Update、Delete操作。ASP.NET引擎通過執行它加上的預存程序“AspNet_SqlCachePollingStoredProcedure”,這個預存程序直接返回“AspNet_SqlCacheTablesForChangeNotification”表的內容,讓ASP.NET引擎知道哪個表的資料發生的變化。
接下來,我們用visual web developer 2005 beta,來建立一個website,往其中增加一個label標籤,以顯示當前執行的時間。並往其中增加一個gridview控制項,用來顯示來自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 |
接下來,我們開始配置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,該參數的意義時設定系統多長時間去檢查一次cache中的資料是否需要更新。而<database>標籤內必須註明需要用到的資料庫連接字串,必須和之前<connectionStrings>中定義的名稱相符合(如本例中,connectionstring的名稱是pubsconn。
最後,我們在程式的首部,加入頁面緩衝的定義語句如下:
<%@ outputcache duration="60" varybyparam="none" sqldependency="Pubs:authors" %>
上面的語句,則定義了網頁輸出快取為1分鐘,並且使用sqldependency,sqldependency的屬性中,以“名稱:表名”的形式定義,其中的名稱,就是剛才我們在web.config中定義的<databases>中的名稱,這裡是pubs。“Pubs:authors”中的authors,則是要使用sqldependency的表名authors表。在這裡要注意的是,雖然我們是用vb.net,但sqldependency屬性中的參數註定是大小寫敏感的,如“Pubs:authors”中的表名authors必須和用Aspnet_regsql在命令列下定義的表名authors一樣。
運行我們的程式,先不修改資料庫中的資料。如:
我們不斷重新整理該應用,會發現由於使用了緩衝功能,上面的時間是不變的。現在我們開啟sql server,修改其中的au_id為172-32-1176的作者名white,將其改為RED,之後再重新整理程式,看到了嗎?由於使用了sqldependency的功能,馬上緩衝中反映出新修改的資料了:
本文簡單介紹了在asp.net 2.0中新增加的sqldependency功能,該功能還有很多其他的應用,具體的可以參閱msdn相關資料。