启用数据库缓存依赖很简单,如下几步

第一步:修改web.config,让项目启用SqlCacheDependency

<connectionStrings>
		<add name="BBSDB" connectionString="server=.;database=NexComTDB;uid=sa;pwd=123456"/>
	</connectionStrings>
	<system.web>
				<caching>
			<sqlCacheDependency enabled="true" pollTime="6000">
				<databases>
					<add name="CacheDatabaseName" connectionStringName="BBSDB" />
				</databases>
			</sqlCacheDependency>
		</caching>
	</system.web>

这里的connectionStringName指定了在<connectionStrings>中添加的某一个连接字符串。name则是为该SqlCacheDependency起的名字。

第二步:通知 数据库、表 启用缓存依赖。

(方法一)

如果要配置SqlCacheDependency,则需要以命令行的方式执行。

aspnet_regsql.exe工具位于Windows//Microsoft.NET//Framework//[版本]文件夹中。

aspnet_regsql -C "data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" -ed -et -t "P_Product"

参数-C后面的字符串是连接字符串(请替换成自己所需要的值),

参数-t后面的字符串是数据表的名字。

  命令执行后,在指定的数据库中会多出一个AspNet_SqlCacheTablesForChangeNotification表。


注意:

要使得7.0或者2000版本以上的SQLServer支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置。

有两种方法配置SQLServer:

一 使用aspnet_regsql命令行工具,

二 使用SqlCacheDependencyAdmin类。

 

例如:

aspnet_regsql -S "server" -E -d "database" –ed  或者

aspnet_regsql -S "server" -E -d "database" -et -t "table"
如果是Sql验证的话要把-E换成,-U (用户名),-P (密码)

 

以下是该工具的命令参数说明

-? 显示该工具的帮助功能;

-S 后接的参数为数据库服务器的名称或者IP地址;

-U 后接的参数为数据库的登陆用户名;

-P 后接的参数为数据库的登陆密码;

-E 使用当前登录用户的 Windows 集成认证进行身份验证。

-d 后接参数为对哪一个数据库采用SqlCacheDependency功能;

-C 连接数据库的连接字符串。如果您指定服务器(-S)和登录(-U和-P,或 -E)信息,则此选项不是必需的,因为连接字符串已经包含这些信息。

-t 后接参数为对哪一个表采用SqlCacheDependency功能;

-ed 允许对数据库使用SqlCacheDependency功能;

-dd 禁止对数据库采用SqlCacheDependency功能;

-et 允许对数据表采用SqlCacheDependency功能;

-dt 禁止对数据表采用SqlCacheDependency功能;

-lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。


 

 (方法2)直接在页面的Page_Load中加入注册代码如下:

protected void Page_Load(object sender, EventArgs e)
    {      System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(System.Configuration.ConfigurationManager.ConnectionStrings["BBSDB"].ConnectionString);//通知哪个数据库
        System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(System.Configuration.ConfigurationManager.ConnectionStrings["BBSDB"].ConnectionString, "NC_BBS_Topic");//通知启用哪个表NC_BBS_Topic

    }

运行时也会向数据库里添加一个AspNet_SqlCacheTablesForChangeNotification表

 

 

第三步:返回缓存集

protected void Button1_Click(object sender, EventArgs e)
    {
        DataSet ds=GetData();
        Repeater1.DataSource = (DataSet)GetCacheUpDate("BBSTopic",ds,"NexComTB", "NC_BBS_Topic");
        Repeater1.DataBind();
   
    }
    //查询数据
    private DataSet GetData()
    {
        DataSet ds = new DataSet();
        int userIdJ = userbll.GetIdByUname("linqiu");
        ds = topicbll.GetAddTopicByUserId(userIdJ);
        return ds;
    }
    #region 数据库缓存依赖
    /// <summary>
    /// 返回缓存值
    /// </summary>
    /// <param name="CacheKey">Cache索引键值</param>
    /// <param name="ds">数据集</param>
    /// <param name="DataBase">数据库Cache名称</param>
    /// <param name="Table">依赖的表</param>
    /// <returns></returns>
    protected object GetCacheUpDate(string CacheKey,DataSet ds,string DataBase,string Table)
    {
        object objModel = GetCache(CacheKey);//从缓存中获取

        if (objModel == null)//缓存里没有
        {

            objModel = ds;//把当前时间进行缓存

            if (objModel != null)
            {

                //CacheDatabaseName是配置文件中的缓存name,table参数可随便 自定义 来更新缓存

                System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency(CacheDatabaseName,Table);

                SetCache(CacheKey, objModel, dep);//写入缓存
            }
           // Response.Write("不是缓存");
        }
        return objModel;
    }
    /// <summary>

    /// 获取当前应用程序指定CacheKey的Cache对象值

    /// </summary>

    /// <param name="CacheKey">索引键值</param>

    /// <returns>返回缓存对象</returns>

   private static object GetCache(string CacheKey)
    {
        System.Web.Caching.Cache objCache = HttpRuntime.Cache;
        return objCache[CacheKey];
    }

    /// <summary>

    /// 设置以缓存依赖的方式缓存数据

    /// </summary>

    /// <param name="CacheKey">索引键值</param>

    /// <param name="objObject">缓存对象</param>

    /// <param name="cacheDepen">依赖对象</param>

    private static void SetCache(string CacheKey, object objObject, System.Web.Caching.CacheDependency dep)
    {
        System.Web.Caching.Cache objCache = HttpRuntime.Cache;
        objCache.Insert(CacheKey,objObject,dep,
                        System.Web.Caching.Cache.NoAbsoluteExpiration,//从不过期
                        System.Web.Caching.Cache.NoSlidingExpiration,//禁用可调过期
                        System.Web.Caching.CacheItemPriority.Default,null);
    }
    #endregion
}

完成。