数据sqlcachedependency功能配置方法

Asp.net2.0sqlserver配合进行缓存有2种方式:轮询查询通知
轮询-----------主要是针对SQL (7.0, 2000, 2005)
查询通知-----只针对Sql2005

 

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 的表加上若干触发器,分别对应到InsertUpdateDelete操作。ASP.NET引擎通过执行它加上的存储过程“AspNet_SqlCachePollingStoredProcedure”,这个存储过程直接返回“AspNet_SqlCacheTablesForChangeNotification”表的内容,让ASP.NET引擎知道哪个表的数据发生的变化。

 

查询通知方式编程步骤:

与基于轮询的失效不同,无需在应用程序的配置中注册任何 <sqlCacheDependency>。而且,无需使用 aspnet_regsql.exe 工具进行任何特殊配置。

基于通知的依赖项是使用字符串 CommandNotification OutputCache 指令上 配置的。此值告知 ASP.NET 应为页或数据源控件创建基于通知的 依赖项。
在页上:
<%@ OutputCache Duration="999999" SqlDependency="CommandNotification" VaryByParam="none" %>
在数据源控件上:
<asp:SqlDataSource EnableCaching="true" SqlCacheDependency="CommandNotification" CacheDuration="Infinite" ... />

在首次执行某 SQL 查询之前,必须在应用程序某处调用 System.Data.SqlClient.SqlDependency.Start() 方法。此方法应放在 global.asax 文件的 Application_Start() 事件中。


 

 

使用 SqlCacheDependencyAdmin

aspnet_regsql 实际上也是在后台使用 SqlCacheDependencyAdmin 类的方法来配置 Microsoft SQL Server。可以直接从 ASP.NET 页面中使用此类的方法。

SqlCacheDependencyAdmin 类具有五个重要的方法:

DisableNotifications为特定数据库禁用 SQL Cache Invalidation

DisableTableForNotifications为数据库中的特定表禁用 SQL Cache Invalidation

EnableNotifications为特定数据库启用 SQL Cache Invalidation

EnableTableForNotifications为数据库中的特定表启用 SQL Cache Invalidation

GetTablesEnabledForNotifications返回启用了 SQL Cache Invalidation 的所有表的列表。

需要注意的是,SQL Cache Invalidation 只能用于 Microsoft SQL Server 7 及更高版本,不能用于其他数据库,例如 Microsoft Access Oracle

 

 

列表 2EnableSCI.aspx (C#)

<%@ Page Language="c#" %>

<%@ Import Namespace="System.Web.Caching" %>

<script runat="server">

const string connectionString = "Server=localhost;Database=Pubs";

void Page_Load()

{

if (!IsPostBack)

{

 SqlCacheDependencyAdmin.EnableNotifications(connectionString);

 SqlDataSource1.SelectParameters.Add("connectionString", connectionString);

}

}

void EnableTable(Object s, EventArgs e)

 

 {

       try

 {

         SqlCacheDependencyAdmin.EnableTableForNotifications( connectionString, txtTableName.Text);

       }

       catch (Exception ex)

 {

        lblErrorMessage.Text = ex.Message;

 } txtTableName.Text = "";

 }

 </script>

 <html>

      <head id="Head1" runat="server">

           <title>Enable SQL Cache Invalidation</title>

     </head>

       <body>

 <form id="form1" runat="server">

      <h1>SQL Cache Invalidation</h1>

 以下表格已启用 SQL Cache Invalidation:

<p>

<asp:GridView id="grdTables"

DataSourceID="SqlDataSource1" CellPadding="10"

ShowHeader="false" Runat="Server" />

</p>

     

<asp:ObjectDataSource

ID="SqlDataSource1"

TypeName="System.Web.Caching.SqlCacheDependencyAdmin"

SelectMethod="GetTablesEnabledForNotifications"

Runat="Server" />

<p>

<asp:Label ID="lblErrorMessage" EnableViewState="false"

ForeColor="red" Runat="Server" />

</p>

 

<asp:TextBox ID="txtTableName" Runat="Server" />

<asp:Button ID="Button1" Text="Enable Table" OnClick="EnableTable"

Runat="Server" />

 

</form>

</body>

</html>

应用

Web.config

<connectionStrings>

    <add name="MyConn" connectionString="server=192.168.1.23;database=carsea;uid=sa;pwd=;" providerName="System.Data.SqlClient"/>

</connectionStrings>

     <system.web>

         <!-- 定义缓存策略-->

         <caching>

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

                   <databases>

                       <!--

          name:必需的 String 属性。

              要添加到配置集合中的 SqlCacheDependencyDatabase 对象的名称。

              此名称用作 @ OutputCache 指令上 SqlDependency 属性的一部分。

          pollTime:设置 SqlCacheDependency 轮询数据库表以查看是否发生更改的频率(以毫秒计算)。这儿是一个测试,所以设为10秒,请加大此值

          -->

          <add connectionStringName="MyConn" name="board"/>

        </databases>

              </sqlCacheDependency>

         </caching>

</system.web>

 

using System.Web.Caching;

string key = "model_type_" + type;

        //从缓存中取值

        CBoardInfo model = (CBoardInfo)HttpRuntime.Cache[key];

        if (model == null)

        {

            //取数据

            model = new CBoardTask().GetModelByType(type);

            //启用更改通知

            SqlCacheDependencyAdmin.EnableNotifications(

ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString);

            //连接到 SQL Server 数据库并为 SqlCacheDependency 更改通知准备数据库表

            SqlCacheDependencyAdmin.EnableTableForNotifications(

ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString, "board");

            //制定缓存策略

            SqlCacheDependency scd = new SqlCacheDependency("board", "board");

            //插入缓存

            HttpRuntime.Cache.Insert(key, model, scd);

        }

        return model;

 

posted @ 2011-03-15 10:47  爱军  阅读(848)  评论(0编辑  收藏  举报