启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
SQL Server Service Broker 为消息和队列应用程序提供 SQL Server 数据库引擎本机支持。这使开发人员可以轻松地创建使用数据库引擎组件在完全不同的数据库之间进行通信的复杂应用程序。开发人员可以使用 Service Broker 轻松生成可靠的分布式应用程序。
使用 Service Broker 的应用程序开发人员无需编写复杂的内部通信和消息,即可跨多个数据库分发数据工作负荷。因为 Service Broker 会处理会话上下文中的通信路径,所以这就减少了开发和测试工作。同时还提高了性能。例如,支持网站的前端数据库可以记录信息并将进程密集型任务发送到后端数据库以进行排队。Service Broker 确保在事务上下文中管理所有任务以确保可靠性和技术一致性。(官网:http://technet.microsoft.com/zh-cn/library/bb522893(v=sql.105).aspx)
使用SqlDependency进行缓存;
缓存是每个系统都必定涉及到的功能,一般的缓存有一个难题——什么时候清除?如Asp.Net中的cache可以设置一个过期时间,但设置多久合适呢?长了浪费,短了就失去缓存的意义了。使用SqlDependency进行缓存则可以解决这个问题。
SqlDependency是.net2.0封装的一个类型,当然要配合sql2005或以上版本才能使用。
SqlDependency类需要数据库的ServiceBroker来支持,当数据库中的数据发生变化时通知应用程序更新缓存,这才是最有效的缓存方式。
步骤一:
sql数据库必须开启ServiceBroker服务,首先检测是否已经启用ServiceBroker,检测方法:
-- 1表示已经启用 0表示没有启用
步骤二:
如果ServiceBroker没有启用,使用下面语句启用:
有时会出现不能启动的问题:
解决办法是:关闭SQLServer的Agent代理功能。 或者 退出SQL Server2005/2008,然后再打开运行sql命令。
步骤三:
在实现基于服务的SQL数据缓存依赖过程中,需要显式调用SqlDependency.Start来启动接受依赖项更改通知的侦听器。
步骤四:缓存实现
使用sqldependency实现缓存的代码:
public class CacheHelper {
static Cache WebCache = HttpContext.Current.Cache;
static string DefaultConn = ConfigurationManager.ConnectionStrings["Camnpr"].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 则是正确的语句。