一.环境配置
首先通过.net Framework 2.0以上的版本文件夹里找到aspnet_regsql.exe,例如:
“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regsql.exe”
配置下系统环境,如果已经有就省了,不配也行。
二.cmd命令
-? 显示该工具的帮助功能;
-S 后接的参数为数据库服务器的名称或者IP地址;
-U 后接的参数为数据库的登陆用户名;
-P 后接的参数为数据库的登陆密码;
-E 当使用windows集成验证时,使用该功能;
-d 后接参数为对哪一个数据库采用SqlCacheDependency功能;
-t 后接参数为对哪一个表采用SqlCacheDependency功能;
-ed 允许对数据库使用SqlCacheDependency功能;
-dd 禁止对数据库采用SqlCacheDependency功能;
-et 允许对数据表采用SqlCacheDependency功能;
-dt 禁止对数据表采用SqlCacheDependency功能;
-lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。
根据上面的简单介绍(详细的-?
获取)例如指定一个表采用sqlcachedependency功能:
>aspnet_regsql -S ip -U 用户名 -P 密码 -d 数据库 -t 表 -et
三.Web.Config配置
配置文件增加下面的代码
<configuration>
<connectionStrings>
<add name="ASqlServer" connectionString="server=localhost;Trusted_Connection=true;database=ceshi" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="1000">
<databases>
<add name="CacheData" connectionStringName="ASqlServer" pollTime="1000"/>
</databases>
</sqlCacheDependency>
</caching>
</system.web>
</configuration>
四.代码
using System.Web;
using System.Web.Caching;
if (HttpContext.Current.Cache["select"] == null)
{
/*获取数据table,这里略了*/
DataTable table=new DataTable();
AggregateCacheDependency acd = new AggregateCacheDependency();
acd.Add(new SqlCacheDependency("CacheData","pm"));//第一个参数不是真实数据库的名字,是Web.Config文件sqlCacheDependency下的name;第二个参数是采用sqlcachedependency功能的表名pm。
HttpRuntime.Cache.Add("select", table, acd, DateTime.Now.AddSeconds(10), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
return table;
}
else
{
return (DataTable)HttpContext.Current.Cache["select"];
}
如果SqlCacheDependency第二个参数:表名填的是没有经过第二步启用缓存通知的表,会报错:没有为 SQL 缓存通知启用数据库“CacheData”中的“t_company”表。
五.效果总结
就是当数据库里启用缓存通知的表,如第四步pm表内有insert,delete,update操作时,会在之前启用缓存通知时自动创建的AspNet_SqlCacheTablesForChangeNotification表里给对应的changeId字段加1,如图。
当changeId变更时,之前的缓存就会因为缓存依赖被清除。然后重新获取数据重新插入缓存。
而且要注意还是会有一丢丢清理缓存延迟的,就是在操作表更新某字段时,立马执行步骤四,还是能到缓存里获取到数据的。但是延迟很小,可能是代码比较简单,所以能手动测试出来。__(:з)∠)_