ASP.NET 2.0數據緩存功能簡介[轉自天極網]

在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,如下圖:

Img221375498.jpg

   這個表有三個字段,“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,代碼如下:
  1. <%@ Page Language="VB" AutoEventWireup="false" CompileWith="Default.aspx.vb" ClassName="Default_aspx" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server"
  5. <title>Untitled Page</title>
  6. </head>
  7. <body>
  8. <form id="form1" runat="server"
  9.  <asp:Label ID="Label1" Runat="server" Text="Label" Width="74px" Height="19px"></asp:Label> 
  10. <br />
  11. <asp:GridView ID="GridView1" Runat="server" DataSourceID="SqlDataSource1"
  12. </asp:GridView>
  13. <br />
  14. <br />
  15. <asp:SqlDataSource ID="SqlDataSource1" Runat="server" SelectCommand="SELECT * FROM authors"
  16. ConnectionString="Initial Catalog=pubs;Data Source=localhost;user id=sa;password=123456"
  17. </asp:SqlDataSource>
  18. </form>
  19. </body>
  20. </html>

  在default.aspx.vb的代碼的page_load事件中,加入以下代碼
  1. Private Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
  2. Label1.Text = CType(System.DateTime.Now(), String)
  3. End Sub
  接下來,我們開始配置web.config文件。我們採用的配置文件如下:
  1. <?xml version="1.0"?>
  2. <configuration>
  3. <connectionStrings>
  4. <add name="PubsConn" connectionString="Initial Catalog=pubs;Data Source=(local);user id=sa;password=123456"/>
  5. </connectionStrings>
  6. <system.web>
  7. <caching>
  8. <sqlCacheDependency enabled="true" pollTime="500"
  9. <databases>
  10. <add name="Pubs" connectionStringName="PubsConn"/>
  11. </databases>
  12. </sqlCacheDependency>
  13. </caching>
  14. </system.web>
  15. </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一樣。

  運行我們的程序,先不修改數據庫中的數據。如下圖:

Img221375499.jpg

   我們不斷刷新該應用,會發現由於使用了緩存功能,上面的時間是不變的。現在我們打開sql server,修改其中的au_id爲172-32-1176的作者名white,將其改爲RED,之後再刷新程序,看到了麼?由於使用了 sqldependency的功能,馬上緩存中反映出新修改的數據了:
  
Img221375500.jpg

  本文簡單介紹了在asp.net 2.0中新增加的sqldependency功能,該功能還有很多其他的應用,具體的可以參閱msdn相關資料。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章