天天看點

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

Asp.net 2.0 提供了一個新的資料緩存功能,就是利用sql server2005 的異步通知功能來實作緩存

1.首先在sqlserver2005 中建立一個test的資料庫.

在SQL Server 2005上執行

ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;語句讓相應的資料庫啟用監聽服務,以便支援SqlDependency特性。

添加一個 employee的資料庫表.

1

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

CREATETABLE[dbo].[employee] (

2

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

[id][int]IDENTITY(1,1)NOTNULL ,

3

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

[name][varchar](50 )

4

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

)

5

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

2使用 vs2005 建立一個新的asp.net項目.

web.config如下

1

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<?xmlversion="1.0"?>

2

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<configurationxmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

3

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<appSettings/>

4

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<connectionStrings>

5

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<addname="mySource"connectionString="DataSource=.\sql2005;InitialCatalog=test;PersistSecurityInfo=True;UserID=sa;Password=sasa"providerName="System.Data.SqlClient"></add>

6

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</connectionStrings>

7

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<system.web>

8

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<compilationdebug="true"/>

9

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<authenticationmode="Windows"/>

10

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</system.web>

11

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</configuration>

12

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

3.編寫global.asax檔案,啟動監聽sql2005通知事件.

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<%@ApplicationLanguage="C#"%>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<%@ImportNamespace="System.Data.SqlClient"%>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<scriptrunat="server">

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

voidApplication_Start(object sender,EventArgse)

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

stringconnStr=ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

SqlDependency.Start(connStr);

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

voidApplication_End(object sender,EventArgse)

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

stringconnStr=ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

SqlDependency.Stop(connStr);

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</script>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

4.編寫資料通路代碼.建立一個EmployeeData的類,代碼如下

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Data;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Data.SqlClient;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Configuration;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Data.Common;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.Caching;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.Security;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.UI;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.UI.WebControls;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.UI.WebControls.WebParts;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.UI.HtmlControls;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

///<summary>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

///EmployeeData的摘要說明

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

///</summary>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

publicclass EmployeeData

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

publicEmployeeData()

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

privateHttpContextcontext;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

publicDataSetGetCacheData()

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

context=HttpContext.Current;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

DataSetcache=(DataSet)context.Cache["employee"];

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

if(cache==null)

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

returnGetData();

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

else

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

returncache;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

publicDataSetGetData()

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

stringconnStr=ConfigurationManager.ConnectionStrings["mySource"].ConnectionString;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

SqlConnectionconn=newSqlConnection(connStr);

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

SqlDataAdapteradp=newSqlDataAdapter("selectid,namefromdbo.employee",conn);

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

SqlCacheDependencydep=newSqlCacheDependency(adp.SelectCommand);

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

DataSetds=newDataSet();

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

adp.Fill(ds);

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

context.Cache.Add("employee",ds,dep,Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration,CacheItemPriority.Default,newCacheItemRemovedCallback(this.DataDiff));

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

returnds;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

publicvoidDataDiff(stringkey,objectvalue,CacheItemRemovedReasonreason)

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

Console.WriteLine("key:"+key);

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

GetData();

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

這裡需要注意的是 select語句的寫法, 不能使用 select * 的方式,一定要在表名前加架構名稱 如我們這裡的 dbo.employee.

5.編寫測試頁面代碼.

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<%

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<htmlxmlns="http://www.w3.org/1999/xhtml">

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<headrunat="server">

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<title>無标題頁</title>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</head>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<body>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<formid="form1"runat="server">

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<div>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

<asp:GridViewID="GridView1"runat="server">

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</asp:GridView>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</div>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</form>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</body>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

</html>

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

6.插入背景代碼

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Data;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Configuration;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.Caching;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Data.SqlClient;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.Security;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.UI;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.UI.WebControls;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.UI.WebControls.WebParts;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

using System.Web.UI.HtmlControls;

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

publicpartialclass _Default:System.Web.UI.Page

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

protectedvoidPage_Load(objectsender,EventArgse)

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

{

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

EmployeeDataem=newEmployeeData();

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

GridView1.DataSource=em.GetCacheData();

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

GridView1.DataBind();

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

}

cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )
cache應用(asp.net 2.0 SQL資料緩存依賴 [SqlCacheDependency ] )

轉自:http://www.cnblogs.com/wzyexf/archive/2008/12/26/1363195.html

SQL資料緩存依賴 [SqlServer | Cache | SqlCacheDependency ]

前言

本文主要是對《ASP.NET 2.0開發指南》——<資料緩存>章節内容的提取并略有補充。

參考資料

1.《ASP.NET 2.0開發指南》

2..NET 2.0 SqlDependency快速上手指南

支援資料庫

SQL SERVER 7.0/2000/2005版本

正文

一、SQL SERVER 7.0/2000和SQL SERVER 2005的簡介及比較

1.1SQL SERVER 7.0/2000

SQL SERVER 7.0/2000沒有提供内置的支援資料緩存依賴的功能,是以隻能通過采用添加特定資料庫表、觸發器等方式,通過背景不斷輪詢資料庫來檢查資料更改。當在資料表上執行INSERT、UPDATE、DELETE操作時将自動發出更改通知,是以隻能監測到表級,具體到哪一行是沒法跟蹤的。

使用方法步驟:

1.1.1使用aspnet_regsql指令行或SqlCacheDependencyAdmin來配置連接配接資料庫。

1.1.1.1ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;

aspnet_regsql -S <server> -Usa -P sa -d <database>-ed啟動資料庫的資料緩存依賴功能

aspnet_regsql -S <server> -Usa -P sa -d <database> -t <table>-et啟動資料表的資料緩存依賴功能

1.1.1.2

SqlCacheDependencyAdmin.EnableNotifications(connectionString);//啟動資料庫的資料緩存依賴功能

SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table);//啟用資料表緩存

推薦這段代碼寫在Global.asax的Application_Start方法中,以便應用程式啟動的時候就啟用資料庫和資料表的緩存依賴功能。

1.1.2配置Web.config

<sqlCacheDependency enabled="true" pollTime="10000">配置在<sytem.web>下的<caching>結點下,隻有一個資料庫的話不必指定下一級<database>結點

1.1.3應用程式資料緩存中使用(還可以在資料源控件、輸出緩存整個頁面時使用,這裡就不介紹了,下同)

SqlCacheDependency scd = new SqlCacheDependency("資料庫名稱","表名");

Cache.Insert(...,scd,...);

1.2SQL SERVER 2005

内置支援SQL資料緩存依賴,内置通知傳遞服務,能夠提供更小粒度的資料更改監測,使用和配置簡單。

使用方法步驟:

1.2.1檢測是否已經啟用Service Broker

Select DATABASEpRoPERTYEX('資料庫名稱','IsBrokerEnabled')-- 1 表示已經啟用 0 表示沒有啟用

這個地方我看有些朋友翻譯的成“是否能啟用”,這是不對的,這裡我把英文原文帖出來:“This can be checked by calling "Select databasepropertyex('db Name', 'IsBrokerEnabled')". A '1' means that the broker is enabled. A '0' means that the broker is not enabled.”。

依據我的經驗,如果直接在目前SqlServer2005上建立一個資料庫的話,預設是打開的,如果是從其他地方資料庫導過來的,導入之後預設關閉了。(可能有不準确,大家可以自己試驗一下測試一下)。如果已經打開可直接調到1.2.2。

1.2.1.1啟用Service Broker

ALTER DATABASE資料庫名稱 SET ENABLE_BROKER;

1.2.2在實作基于服務的SQL資料緩存依賴過程中,需要顯式調用SqlDependency.Start來啟動接受依賴項更改通知的偵聽器。

SqlDependency.Start(connectionString);//推薦将這段代碼加到Global.asax的Application_Start方法中,

SqlDependency.Stop(connectionString);//用于關閉,可加在Global.asax的Application_End方法中。

1.2.3應用程式資料緩存中使用

SqlCommand cmd = new SqlCommand(sql,conn);

SqlCacheDependency scd = new SqlCacheDependency(cmd);

Cache.Insert(...,scd,...);

注意:

a).必須設定完全限定名稱的資料表。即表名前面需要加所有者,如dbo.test。

b).必須明确設定所通路資料庫列名稱,不能使用“*”。

c).必須保證不是聚合函數。如COUNT、MAX等。

1.3比較、差別

SQL SERVER 7.0/2000 SQL SERVER 2005
實作機制 輪詢 通知傳遞服務(Service Broker)
是否需要配置啟用 需要 不需要,内置支援
資料更改檢測 限于表級更改監測 表級、行級更改監測

并且很明顯,SQL SERVER 2005的緩存機制更加高效。另外,SqlCacheDependency類還特别結合SQL SERVER 2005 進行了優化:

a).使用SQL SERVER 2005 時,SqlCacheDependency類支援與System.Data.SqlClient.SqlDependency類進行內建。應用程式可建立SqlDependency對象,并通過OnChanged事件處理程式接受通知進行注冊。這樣,應用程式不僅可以使用Sql server 2005的查詢通知機制來監測使用SQL查詢結果無效的資料更改,并将緩存對象從緩存中移除,而且還可以輕松擷取資料更改通知,以便重新整理緩存。(從這裡可以看出,當觸發onRemoveCallback委托的時候,資料已經從緩存裡面删除了,這樣一來可以手動在委托裡面添加緩存,或者幹脆設定成null,讓他下次調用的時候再緩存。)

b).不僅向應用程式添加緩存依賴項,還可以與@OutputCache指令一起使用,以生成依賴于SqlServer資料庫表的輸出緩存的頁面或使用者控件。對于使用者控件,@OutputCache指令不支援使用SQL SERVER 2005的查詢通知(即onRemoveCallback委托)。

二、System.Web.Caching.Cache Insert和Add差別

2.1Add方法

object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

2.2Insert方法

void Insert(string key, object value);

void Insert(string key, object value, CacheDependency dependencies);

void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);

void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);

void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

2.3比較、差別

a).Insert方法支援5種重載,使用靈活,而Add方法必須提供7個參數;

b).Add方法可以傳回緩存項的資料對象,Insert 傳回Void;

c).添加重複緩存情況下,Insert會替換該項,而Add方法會報錯。

三、CacheDependency、AggregateCacheDependency、SqlCacheDependency

3.1CacheDependency是AggregateCacheDependency和SqlCacheDependency的父類。主要用于在應用程式資料緩存對象與檔案、緩存鍵、檔案或緩存鍵的數組或另外一個CacheDependency對象之間建立依賴關系。CacheDependency監視依賴關系比便在任何對象更改時自動移除緩存對象。CacheDependency可以監測一組(到檔案或目錄的)檔案路徑的更改情況。

3.2AggregateCacheDependency主要用于實作聚合緩存依賴。如一筆資料同時對兩個表進行緩存依賴,一旦其中任何一個表資料更改緩存将失效。

3.3SqlCacheDependency将應用程式資料緩存對象、頁面輸出緩存、資料源控件等與指定SQL Server資料庫表或Sql Server 2005 查詢結果之間建立緩存依賴關系,在表發生更改(Sql Server 2005行級别更改)時,自動從緩存中删除和重新添加與該表關聯的緩存對象。一般而言:

SqlCacheDependency (SqlCommand)用于SQL SERVER 2005

SqlCacheDependency (資料庫名, 表名)用于SQL SERVER 7.0/2000

結束

惱于搜來搜去就那麼幾篇文章,全是轉載,迫切需要要深入的了解緩存方面的知識,猛想起自己花10塊買的正版<<ASP.NET 2.0開發指南>>還沒有仔細讀過,果然是本好書!寫得極其詳細,這裡就整理提取一下然後貼上來以防止經常背着這本818頁的書到處跑。歡迎指正: )

轉自:http://www.cnblogs.com/over140/archive/2009/01/15/1376318.html

錯誤:無法啟用資料庫中的 Service Broker

解決方案:

Service Broker 辨別符在同一網絡上的所有執行個體中應是唯一的。否則,消息可能被誤傳。

那麼怎麼能讓資料庫也能使用Service Broker呢?

ALTER DATABASE TpriUserManage SET NEW_BROKER

ALTER DATABASE TpriUserManage SET ENABLE_BROKER