阿宽

Nothing is more powerful than habit!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SqlCacheDependency使用轮流检测技术(轮询)使缓存无效

Posted on 2011-02-27 22:48  宽田  阅读(920)  评论(0编辑  收藏  举报

系列目录:

SqlDependency缓存用法

Asp.net使用SqlDependency

SqlCacheDependency使用命令通知使缓存无效

CacheDependency用法

AggregateCacheDependency 用法

SqlCacheDependency使用轮流检测技术(轮询)使缓存无效 

-------------------------------------------------------------------------------------------------

 在Sql Server 7及后继版本中都可以使用轮流检测技术(轮询)使缓存无效,但只有Sql Server 7和Sql server 2000支持这种技术。如查是Sql Server2005及后继版本可以使用查询(命令)通知技术来使缓存无效。

用法

1、在配置轮流检测技术时,首先要配置每个要进行检测的Sql Server数据库,然后配置要进行检测的每个表。

  1)配置数据库

  格式:

aspnet_regsql  –S 服务器名 –E –D 数据库名  –et

    例:配置本机的NhibernateSample数据库

aspnet_regsql  –S . –E –d "NHibernateSample"   –et

    说明:执行此命令后,会在指定的数据库中会新建一个“AspNet_SqlCacheTablesForChangeNotification”表。

    网上看到另外一个格式,如下。

“aspnet_regsql  –S 服务器名 –U 登陆名 ID –P 密码 –d 数据库名  –ed”

 

  2)配置表
    格式:

aspnet_regsql  –S 服务器名 –E –d 数据库名 -t 表名  –et

     例:配置本机NhibernateSample数据库的Customer表

aspnet_regsql  –S "." –E –d "NHibernateSample" -"Customer"  –et

 

     说明:执行此命令后,会在表“AspNet_SqlCacheTablesForChangeNotification”中添加一行,并在Customer表上建立有关Insert、Update、Delete的触发器。

     网上看到另外一种格式,如下。

aspnet_regsql –S 服务器名  –U 登陆名 ID –P 密码 –d 数据库名 –t 追踪的数据表 –et

  关闭此表的通知为:

aspnet_regsql  -S . --d "NHibernateSample" -t "Customer"  -dt

 

 

     如果觉得手工建立麻烦。也可在程序中使用代码来替代。代码如下:

                //要检测的数据库
                SqlCacheDependencyAdmin.EnableNotifications(
                    ConfigurationManager.ConnectionStrings[
"NHibernateSampleDb"].ConnectionString);
                
//初检测数据库中要检测的表
                SqlCacheDependencyAdmin.EnableTableForNotifications(
                    ConfigurationManager.ConnectionStrings[
"NHibernateSampleDb"].ConnectionString, "Customer");

 

 2、编写程序。

    下边程序一个Asp.net程序。所以需要配置web.config.要配置的地方如下。 注意下边加粗的部分。

<connectionStrings>
    
<add name="NHibernateSampleDb" providerName="System.Data.SqlClient" 
         connectionString
="Data Source=.; Initial Catalog=NHibernateSample; 
Persist Security Info=True;User ID=sa;Password=123"
/>

  
</connectionStrings>
  
<system.web>
    
<caching>
      
<sqlCacheDependency enabled="true">
        
<databases>
          
<add name="CacheDependency_NHibernateSampleDb" connectionStringName="NHibernateSampleDb" pollTime="5000"/>
        
</databases>
      
</sqlCacheDependency>
    
</caching>
 
</system.web>

 

 

    页面上添加OutputCache,用于缓存页面。并依赖于SqlCacheDependency。页面源码如下。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CacheDependencyPage.aspx.cs"
    Inherits
="SqlDependencyInAspNet.CacheDependencyPage" %>

    
<% @ OutputCache Duration ="9999" VaryByParam ="None" SqlDependency ="CacheDependency_NHibernateSampleDb:Customer" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    
<title></title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
    
</div>
    
</form>
</body>
</html>

 

 编写代码如下,注意加粗部分。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Configuration;
using System.Data;
using System.Web.Caching;

namespace SqlDependencyInAspNet
{
    
public partial class AggregateCacheDependencyUse : System.Web.UI.Page
    {
        
protected void Page_Load(object sender, EventArgs e)
        {
            
if (!IsPostBack)
            {
                GetData();
            }
        }

        
private void GetData()
        {
            
string cacheData = "内容";
            
if (Cache["data"== null)
            {
                
//要检测的数据库
                SqlCacheDependencyAdmin.EnableNotifications(
                    ConfigurationManager.ConnectionStrings[
"NHibernateSampleDb"
].ConnectionString);
                
//初检测数据库中要检测的表

                SqlCacheDependencyAdmin.EnableTableForNotifications(
                    ConfigurationManager.ConnectionStrings[
"NHibernateSampleDb"].ConnectionString, "Customer");
                SqlCacheDependency scd 
= new SqlCacheDependency("CacheDependency_NHibernateSampleDb""Customer
");
                Cache.Insert(
"data"
, cacheData, scd);
                
//此处可以加入自己的其它方法,如重新从数据库取得资料
                Response.Write("取用新的内容");
            }
            
else
            {
                cacheData 
= (string)Cache["data"];
                Response.Write(
"调用Cache内容");
            }
            Response.Write(cacheData);
        }

    }
}

 

 

 最后测试。启动程序后刷新,程序将会中缓存中取数据。修改数据库中表Customer,然后刷新,这次将重新取数据,OutputCache也将随之实更新。