天天看點

溫故知新ASP.NET 2.0(C#)(4) - Cache&SqlCacheDependency(緩存和SqlCacheDependency特性)

溫故知新ASP.NET 2.0(C#)(4) - Cache&SqlCacheDependency(緩存和SqlCacheDependency特性)

介紹

存是在計算中廣泛使用的一種技術,通過将經常通路的資料或存取開銷較大的資料保留在記憶體或硬碟中來提高性能。在 Web 應用程式的上下文中,緩存用于在 HTTP 請求之間保留頁或資料,在重用它們時可以不必耗費資源重新建立。

關鍵

1、@OutputCache指令中的屬性:

    Duration - 緩存時間(秒)

    VaryByParam - 根據使用 POST 或 GET 發送的名稱/值對來改變緩存的結果(多參數用分号隔開)

    VaryByControl - 根據使用者控件中的控件來改變緩存的片段(值是控件ID,多控件用分号隔開)

    CacheProfile - 調用配置檔案中設定的緩存時間

2、增加資料緩存時用Cache.Insert,可以指定緩存時間

3、替換緩存(Substitution)- 回調函數要是靜态的

4、SqlCacheDependency

配置檔案中的配置

<system.web> 

        <caching> 

            <sqlCacheDependency enabled="true" pollTime="輪詢時間(毫秒)"> 

                <databases> 

                    <add name="名字" connectionStringName="連接配接字元串的名字" /> 

                </databases> 

            </sqlCacheDependency> 

            <!-- 如果是SqlServer2005的話,則隻需如下設定,因為SqlServer支援基于通知的緩存失效 

            <sqlCacheDependency enabled="true" /> 

            --> 

        </caching> 

    </system.web>

如果不是SqlServer2005的話,應該使用aspnet_regsql注冊一下

aspnet_regsql.exe -S "server" -E -d "database" -ed

aspnet_regsql.exe -S "server" -E -d "database" -et -t "table"

如果是Sql驗證的話要把-E換成,-U(使用者名),-P(密碼)

示例

頁面輸出緩存

Cahce/Page.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Page.aspx.cs" 

        Inherits="Cahce_Page" Title="頁面輸出緩存" %> 

<%@ OutputCache Duration="10" VaryByParam="none" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 

        <p> 

                Duration="10" VaryByParam="none" 

        </p> 

                <%=DateTime.Now %> 

</asp:Content>

API操作緩存

Cahce/Page.aspx.cs

using System; 

using System.Data; 

using System.Configuration; 

using System.Collections; 

using System.Web; 

using System.Web.Security; 

using System.Web.UI; 

using System.Web.UI.WebControls; 

using System.Web.UI.WebControls.WebParts; 

using System.Web.UI.HtmlControls; 

public partial class Cahce_Page : System.Web.UI.Page 

        protected void Page_Load(object sender, EventArgs e) 

        { 

                /* 通過API設定緩存 不常用啊 

                // 相當于@OutputCache指令中的Duration屬性 

                Response.Cache.SetExpires(DateTime.Now.AddSeconds(10)); 

                // 以指定響應能由用戶端和共享(代理)緩存進行緩存。 

                Response.Cache.SetCacheability(HttpCacheability.Public); 

                // 過期時間可調 

                Response.Cache.SetSlidingExpiration(true); 

                */ 

        } 

}

頁面輸出緩存(VaryByParam)

Cahce/PageByParam.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="PageByParam.aspx.cs" 

        Inherits="Cahce_PageByParam" Title="頁面輸出緩存(VaryByParam)" %> 

<%@ OutputCache CacheProfile="CacheTest" VaryByParam="p1;p2" %> 

                CacheProfile="CacheTest" VaryByParam="p1;p2" 

                <br /> 

                CacheProfile="CacheTest" - 從web.config中讀資訊 

                get或post方式都行 

                <a href="?p1=a&p2=b">第一組</a> 

                <a href="?p1=c&p2=d">第二組</a> 

                <a href="?p1=e&p2=f">第三組</a> 

上面頁所需的web.config中的配置

            <outputCacheSettings> 

                <outputCacheProfiles> 

                    <add name="CacheTest" duration="10" /> 

                </outputCacheProfiles> 

            </outputCacheSettings> 

頁面輸出緩存(VaryByControl)

Cahce/CacheControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CacheControl.ascx.cs" 

        Inherits="Cahce_CacheControl" %> 

<%@ OutputCache Duration="10" VaryByControl="DropDownList1" %> 

<p> 

        <%=DateTime.Now %> 

</p> 

        <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="XmlDataSource1" 

                DataTextField="text" DataValueField="value"> 

        </asp:DropDownList><asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/Config/DropDownListData.xml"> 

        </asp:XmlDataSource> 

        <asp:Button ID="btn" runat="Server" Text="送出" /> 

</p>

Cahce/PageByControl.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="PageByControl.aspx.cs" 

        Inherits="Cahce_PageByControl" Title="頁面輸出緩存(VaryByControl)" %> 

<%@ Register Src="CacheControl.ascx" TagName="CacheControl" TagPrefix="uc1" %> 

                未經緩存設定的容器頁: 

                經過VaryByControl設定的使用者控件,根據DropDownList的不同緩存不同的内容(使用者控件中的@OutputCache指令為Duration="10" 

                VaryByControl="DropDownList1"):<br /> 

                <uc1:CacheControl ID="CacheControl1" runat="server" /> 

資料緩存

Cahce/Data.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Data.aspx.cs" 

        Inherits="Cahce_Data" Title="資料緩存" %> 

                <asp:Label ID="lbl" runat="server" /> 

Cahce/Data.aspx.cs

public partial class Cahce_Data : System.Web.UI.Page 

                // 一看就懂 

                if (Cache["key"] == null) 

                { 

                        Cache.Insert("key", DateTime.Now, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero); 

                } 

                DateTime dt = (DateTime)Cache["key"]; 

                lbl.Text = dt.ToString(); 

替換緩存(部分區域強行不使用緩存)

Cahce/Substitution.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Substitution.aspx.cs" 

        Inherits="Cahce_Substitution" Title="替換緩存(部分區域強行不使用緩存)" %> 

                API 向傳回目前日期的靜态方法中插入動态回調,此回調在每次請求時都會執行<br /> 

                <% Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetTime)); %> 

                使用Substitution 控件插入動态内容<br /> 

                <asp:Substitution ID="Substitution1" runat="server" MethodName="GetTime" /> 

Cahce/Substitution.aspx.cs

public partial class Cahce_Substitution : System.Web.UI.Page 

        // 回調函數所調的靜态方法 

        public static string GetTime(HttpContext context) 

                return DateTime.Now.ToString(); 

SqlCacheDependency

頁的Sql緩存

Cahce/SqlCachePage.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="SqlCachePage.aspx.cs" 

        Inherits="Cahce_SqlCachePage" Title="頁的Sql緩存" %> 

<%@ OutputCache Duration="999999" SqlDependency="VS2005_Test:sqlcache" VaryByParam="none" %> 

                Duration="999999" SqlDependency="VS2005_Test:sqlcache" VaryByParam="none"<br /> 

                如果是SqlServer2005則改成SqlDependency="CommandNotification<br /> 

                注意配置檔案中的配置 

資料源控件的Sql緩存

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="SqlCacheDataSourceControl.aspx.cs" 

        Inherits="Cahce_SqlCacheDataSourceControl" Title="資料源控件的Sql緩存" %> 

                DataSource控件設定如下屬性:EnableCaching="True" SqlCacheDependency="VS2005_Test:sqlcache" 

                CacheDuration="Infinite"<br /> 

                <asp:SqlDataSource ID="SqlDataSource1" runat="server" EnableCaching="True" SqlCacheDependency="VS2005_Test:sqlcache" 

                        CacheDuration="Infinite" ConnectionString="<%$ ConnectionStrings:SqlConnectionString %>" 

                        SelectCommand="SELECT * FROM [SqlCache]"></asp:SqlDataSource> 

                <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AllowSorting="True"> 

                </asp:GridView> 

web.config中的相關配置

<connectionStrings> 

        <add name="SqlConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\VS2005_Test.mdf;Integrated Security=True;User Instance=True" 

            providerName="System.Data.SqlClient" /> 

    </connectionStrings> 

    <system.web> 

            <sqlCacheDependency enabled="true" pollTime="10000"> 

                    <add name="VS2005_Test" connectionStringName="SqlConnectionString" /> 

注意

Sql Server 2005 基于通知的緩存失效,不用aspnet_regsql設定,要設定屬性SqlDependency="CommandNotification"。在首次執行某 SQL 查詢之前,必須在應用程式某處調用 System.Data.SqlClient.SqlDependency.Start() 方法。此方法應放在 global.asax 檔案的 Application_Start() 事件中。因為Sql Server 2005 基于通知的緩存失效對支援查詢通知的查詢文法有許多限制,是以我覺得最好先别用,而是使用輪詢機制。在使用輪詢機制時如本例子中的SqlCacheDependency="VS2005_Test:sqlcache",冒号前面是配置檔案中配置的相關值指向資料庫連接配接,後面是啟用SqlCache的表名,注意區分大小寫。

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344879,如需轉載請自行聯系原作者