使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀),
例如:select * from table1,select column1 from table1,select count(*) from table1 都是错误的sql查询语句,select column1 from dbo.table1 则是正确的语句。
使用步骤
一 为数据库开启SqlCacheDependency功能
方法1:使用aspnet_regsql命令行或SqlCacheDependencyAdmin来配置连接数据库。
aspnet_regsql -S SQL服务器名 -E -d 数据库 -ed 启动数据库的数据缓存依赖功能
我们还需要对相关的数据表执行aspnet_regsql命令,如:
aspnet_regsql -S SQL服务器名 -E -d 数据库 -t 表名 -et 多个表就多次执行这句话
方法2:
SqlCacheDependencyAdmin.EnableNotifications(connectionString); //启动数据库的数据缓存依赖功能
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table); //启用数据表缓存
推荐这段代码写在Global.asax的Application_Start方法中,以便应用程序启动的时候就启用数据库和数据表的缓存依赖功能。
二 配置Web.config
<!--缓存配置-->
<caching>
<!--pollTime为查询数据库是否变动的间隔时间,毫秒单位-->
<sqlCacheDependency enabled="true" pollTime="10000">
<databases>
<add name="数据库名" connectionStringName="Webconfig的连接字符串key" pollTime="10000"/>
</databases>
</sqlCacheDependency>
</caching>
三 编码实现
缓存操作类:
/// <summary>
/// 获取所有相关配置并对应添加CacheDependency对象
/// </summary>
/// <param name="configKey">指定需要使用Cache的数据库表名的Webconfig's key</param>
/// <returns></returns>
public static AggregateCacheDependency GetDepandency(string configKey)
{
AggregateCacheDependency dependency = new AggregateCacheDependency();
string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
string tableConfig = ConfigurationManager.AppSettings[configKey];
string[] tables = tableConfig.Split(',');
foreach (string tableName in tables)
dependency.Add(new SqlCacheDependency(dbName, tableName));
return dependency;
}
缓存业务类:
/// <summary>
/// 友情链接SqlCacheDependency类
/// </summary>
public class LinksProxy
{
/// <summary>
/// 设置缓存持续时间
/// </summary>
private static readonly int CacheTimeout = int.Parse(ConfigurationManager.AppSettings["LinksCacheDuration"]);
/// <summary>
/// 是否开启缓存
/// </summary>
private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);
/// <summary>
/// 获取全部友情链接
/// </summary>
public static IList<LinksInfo> GetLinks()
{
//如果不开启缓存则直接调用DAL方法执行常规操作
if (!enableCaching)
return LinksDAL.SelectLinks();
else //开启缓存
{
//设置缓存key,这个最好根据查询条件来设置,这样可以缓存同一条件的数据
string key = "Links_by_search_all";
//读取缓存中的数据
IList<LinksInfo> data = (IList<LinksInfo>)HttpRuntime.Cache[key];
if (data == null)//如果缓存没有读到数据
{
//访问DAL从数据库读取数据并加入缓存,最后返回
data = LinksDAL.SelectLinks();
AggregateCacheDependency acd = TableCacheDependency.GetDepandency("LinksTableDependency");
HttpRuntime.Cache.Add(key, data, acd,DateTime.Now.AddMinutes(CacheTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
}
return data;
}
}
}