使用SqlDependency进行缓存

 

缓存是每个系统都必定涉及到的功能,一般的缓存有一个难题——什么时候清除?如Asp.Net中的cache可以设置一个过期时间,但设置多久合适呢?长了浪费,短了就失去缓存的意义了。使用SqlDependency进行缓存则可以解决这个问题。

SqlDependency是.net2.0封装的一个类型,当然要配合sql2005或以上版本才能使用。

SqlDependency类需要数据库的ServiceBroker来支持,当数据库中的数据发生变化时通知应用程序更新缓存,这才是最有效的缓存方式。

 

步骤一:

sql数据库必须开启ServiceBroker服务,首先检测是否已经启用ServiceBroker,检测方法:

 

 
  
Select DATABASEpRoPERTYEX( ' 数据库名称 ' , ' IsBrokerEnabled ' )

 

 

--1表示已经启用0表示没有启用

 

步骤二:

如果ServiceBroker没有启用,使用下面语句启用:

 
  
ALTER DATABASE < 数据库名称 > SET ENABLE_BROKER;

 

步骤三:

在实现基于服务的SQL数据缓存依赖过程中,需要显式调用SqlDependency.Start来启动接受依赖项更改通知的侦听器。

 

 
  
SqlDependency.Start(connectionString); // 推荐将这段代码加到Global.asax的Application_Start方法中
SqlDependency.Stop(connectionString); // 用于关闭,可加在Global.asax的Application_End方法中

 

步骤四:缓存实现

 使用sqldependency实现缓存的代码:

 

 
  
public class CacheHelper
{
static Cache WebCache = HttpContext.Current.Cache;
static string DefaultConn = ConfigurationManager.ConnectionStrings[ " Default " ].ConnectionString;

public static DataTable GetSystemParams()
{
if (WebCache[ " SystemParam " ] == null )
{
string strSQL = " select uSystemParamID,ParamName,ParamValue,Description from dbo.DTS_SystemParam " ;
SqlDataAdapter da
= new SqlDataAdapter(strSQL, DefaultConn);
SqlDependency dep
= new SqlDependency(da.SelectCommand);
dep.OnChange
+= new OnChangeEventHandler(dep_OnChange);
DataTable tbl
= new DataTable();
da.Fill(tbl);
WebCache[
" SystemParam " ] = tbl;
return tbl;
}
else
{
return (DataTable)WebCache[ " SystemParam " ];
}
}

private static void dep_OnChange( object sender, SqlNotificationEventArgs e)
{
WebCache.Remove(
" SystemParam " );
}
}

 

注意:

使用 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 则是正确的语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值