SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式。

1  轮询模式实现步骤

此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持

主要包含以下几步:

 1.1  使用aspnet_regsql命令行或SqlCacheDependencyAdmin来配置连接数据库 

ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;  //启用 Service Broker,需要在数据库中执行,或者在数据库右键属性,选项中修改ENABLE BROKER为true

//注意修改时,需要关闭所有和此数据库关联的窗口,否则修改不成功。

报如下错误:

Alter failed for Database 'pu'.  (Microsoft.SqlServer.Smo)          
                         An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)              
                       Database state cannot be changed while other users are using the database 'pu'
                      ALTER DATABASE statement failed. (Microsoft SQL Server, Error: 5070)

aspnet_regsql -S <server> -U sa -P sa -d <database> -ed     启动数据库的数据缓存依赖功能

aspnet_regsql -S <server> -U sa -P sa -d <database> -t <table> -et     启动数据表的数据缓存依赖功能

注意:系统默认不能识别aspnet_regsql,.net 4.0中aspnet_regsql的默认路径为C:\Windows\Microsoft.NET\Framework\v4.0.30319,需要首先把当前目录修改为C:\Windows\Microsoft.NET\Framework\v4.0.30319,才可以执行此命令。

1.2  配置文件

<?xml version="1.0"?>
<configuration><connectionStrings><add name="PubsConnectionString" connectionString="Data Source=10.32.153.165; Initial Catalog=pubs;uid=sa;pwd=q1w2e31@;" providerName="System.Data.SqlClient" /></connectionStrings><system.web><compilation debug="true" targetFramework="4.0" /><caching><sqlCacheDependency enabled = "true" pollTime = "1000" ><databases><!--name:必需的 String 属性。 要添加到配置集合中的 SqlCacheDependencyDatabase 对象的名称。此名称用作 @ OutputCache 指令上 SqlDependency 属性的一部分。pollTime:设置 SqlCacheDependency 轮询数据库表以查看是否发生更改的频率(以毫秒计算)。这儿是一个测试,所以设为10秒,请加大此值connectionStringName 必选的 String 特性。为数据库设置连接字符串名称。 在 connectionStrings 元素(ASP.NET 设置架构) 配置节中引用连接字符串。--><add name="Pubs" connectionStringName = "PubsConnectionString" /></databases></sqlCacheDependency></caching> </system.web>
</configuration>

注意:connectionStrings,和caching两节的关系,caching节的connectionStringName需要和connectionStrings中的name对应的。

 1.3   SqlCacheDependencyAdmin使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Caching;
using System.Configuration;
using System.Data.SqlClient;
namespace TestWebSqlCacheDependency
{public partial class _Default : System.Web.UI.Page{string key = "model_type";protected void Page_Load(object sender, EventArgs e){         TextBox1.Text = test();// test();
        } private string test(){//从缓存中取值string model = null;if (HttpRuntime.Cache[key] != null){model = HttpRuntime.Cache[key].ToString();}if (model == null){//取数据model = getDBValue();//启用更改通知
                SqlCacheDependencyAdmin.EnableNotifications(ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString);//连接到 SQL Server 数据库并为 SqlCacheDependency 更改通知准备数据库表
                SqlCacheDependencyAdmin.EnableTableForNotifications(ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString, "TableTest");//第二个参数是要监控的表名称//制定缓存策略SqlCacheDependency scd = new SqlCacheDependency("Pubs", "TableTest");//注意此处的Pubs需要要配置文件的caching节下的databases节下的name对应,而不是随便写的,目前个人测试的结论就是这样。第二个参数是要监控的表名称//插入缓存
                HttpRuntime.Cache.Insert(key, model, scd);}return model;}private string getDBValue(){SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString);cn.Open();SqlCommand cd = cn.CreateCommand();cd.CommandText = " select top 1 TableTest.col2 from TableTest ";object o = cd.ExecuteScalar();cn.Close();if (o != null){return o.ToString();}return null;}}
}

轮询模式的实质,就是在数据库中多了一个表AspNet_SqlCacheTablesForChangeNotification,在需要监视改变的表也多了一个Trigger,触发器名称为:表名_AspNet_SqlCacheNotification_Trigger,在每次表中有数据时,会触发此触发器,向AspNet_SqlCacheTablesForChangeNotification表中插入数据,系统会隔一段时间查询一次,发现有改变时,就会清空相对应的cache,caching节的pollTime其实就是查询间隔,也就是说,如果此时间设置的很长,数据库中的数据修改后,需要很长时间,才能清空对应的cache,最长延时可到达pollTime对应的时间,性能并不是很好。

 2  通知模式实现步骤

SQL SERVER 2005(包括SQL SERVER 2005)以上的数据库才可以使用。

    2.1  启用Service Broker

Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled')  --检测是否启用了 Service Broker, 1 表示已经启用 0 表示没有启用

ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;  //启用 Service Broker,需要在数据库中执行,或者在数据库右键属性,选项中修改 ENABLE BROKER为true, 与轮询模式完全一致,但不要aspnet_regsql相应的脚本。

2.2  启动调用SqlDependency.Start,结束时调用SqlDependency.Stop()

最好放进Global中,例如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Data.SqlClient;
using System.Web.Caching;
namespace WebTest2
{public class Global : System.Web.HttpApplication{void Application_Start(object sender, EventArgs e){#region SQL2005SqlDependency.Start(ConnectionString_SQL2005);//推荐将这段代码加到Global.asax的Application_Start方法中#endregion}void Application_End(object sender, EventArgs e){SqlDependency.Stop(ConnectionString_SQL2005);}     }
}

调试时注意一定要运行SqlDependency.Start()这句,否则就会出错,所以测试时不要使用预览模式。由于vs会启动WebDev.WebServer40.EXE ,导致 SqlDependency.Start()可能就没有运行,所以调试时一定要把VS启动的WebDev.WebServer40.EXE的前一次模拟服务停止了,使vs重新启动WebDev.WebServer40.EXE,并运行SqlDependency.Start()。

2.3  使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System;
using System.Configuration;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Caching;
namespace WebTest2
{public partial class _Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){          DataTable dt = HttpRuntime.Cache["dt"] as DataTable;if (dt == null){using (SqlConnection sqlCon = new SqlConnection(WebConfigHelper.ConnectionString_SQL2005)){sqlCon.Open();SqlCommand sqlCmd = new SqlCommand();sqlCmd.Connection = sqlCon;sqlCmd.CommandText = "select col2 from dbo.TableTest";dt = new DataTable();SqlCacheDependency scd = new SqlCacheDependency(sqlCmd);    SqlDataAdapter sda = new SqlDataAdapter(sqlCmd);                   sda.Fill(dt);            HttpRuntime.Cache.Insert("dt", dt, scd);              sqlCon.Close();}}GridView1.DataSource = dt;GridView1.DataBind();         }      }
}

很明显通知模式,配置文件不需要任何特殊处理,数据库中也没有增加表AspNet_SqlCacheTablesForChangeNotification和Trigger,性能也比轮询模式好的多。只要数据库中数据有改变,cache中的对应数据就会清空,基本上是实时的,不像轮询模式由pollTime决定。

 另外通知模式的查询语句也有一定的要求,这一定要注意。参考支持的 SELECT 语句

 存储过程不能包含SET NOCOUNT ON,WITH(NOLOCK),否者数据不能缓存到Cache,每次都是重新读取数据库,不管数据有没有改变。

通知模式的延时估计有几百毫秒,也就是说,在更新数据库后,立即读取Cache数据不是空的,但我测试一秒后就为空了,不会影响实际使用的,但对单元测试会有影响,一定要Thread.sleep(1000),否则单元测试不能通过。

转载于:https://www.cnblogs.com/MuNet/p/9328304.html

SQL Server SqlCacheDependency 缓存依赖相关推荐

  1. SQL server数据缓存依赖

    为什么80%的码农都做不了架构师?>>>    SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/ ...

  2. 【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解

    首先声明一下如果您还不了解什么是Cache(缓存)请您先搜一下有关信息然后再看这篇文章. 当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础.应用程序可以通过两种途径获 ...

  3. sql server 缓存_深入了解SQL Server缓冲区缓存

    sql server 缓存 When we talk about memory usage in SQL Server, we are often referring to the buffer ca ...

  4. 优化SQL Server的内存占用之执行缓存

    优化SQL Server的内存占用之执行缓存篇 优化SQL Server的内存占用之执行缓存 在论坛上常见有朋友抱怨,说SQL Server太吃内存了.这里笔者根据经验简单介绍一下内存相关的调优知识. ...

  5. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  6. SQL Server代理(4/12):配置数据库邮件

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在以前的文章里我们看到,SQL Serve ...

  7. SQL Server索引总结二

    从CREATE开始 通过显式的CREATE INDEX命令 在创建约束时作为隐含的对象 随约束创建的隐含索引 当向表中添加如下两种约束之一时,就会创建隐含索引. 主键约束(聚集索引) 唯一约束(唯一索 ...

  8. Microsoft SQL Server 2000整合规划

    Microsoft SQL Server 2000整合规划 更新日期: 2004年06月24日 SQL Server技术文章 作者:Allan Hirt 投稿人:Tom Davidson和Shaun ...

  9. sql server 跟踪_SQL Server跟踪标志指南; 从-1到840

    sql server 跟踪 SQL Server trace flags are configuration handles that can be used to enable or disable ...

最新文章

  1. Leetcode264. Ugly Number II丑数2
  2. 好文转载—程序员在工作中会追求什么?
  3. 字节跳动践行节能减排,数据中心能效居行业前列
  4. 51单片机按键控制数码管0~9_51单片机外部中断
  5. 【转】WPF调用图片路径,或资源图片
  6. java编写一个集合类_Java集合类
  7. 新一季“十大最堵互联网公司”出炉:360百度腾讯跻身三甲
  8. select - I/O多路复用
  9. 把列表中的0全部移到后面,非零元素出现的顺序不变,要求在原列表上进行.
  10. 一大波PyTorch图像分割模型来袭,俄罗斯程序员出品新model zoo
  11. java scala中传递变长参数
  12. android游戏菜鸟教程,菜鸟教程app
  13. Oracle彻底卸载干净教程
  14. Android Studio ADB 环境变量配置
  15. 串口服务器通讯协议,串口服务器的组成和应用实例
  16. Swift 之横竖屏切换
  17. 管理与维护Linux系统
  18. 计算机怎么取消u盘启动程序,如何设置电脑启动项的为U盘启动,小编教你如何设置电脑启动项的为U盘启动...
  19. 树莓派raspios(原raspbian)下载地址
  20. iOS开发 - 商品详情页两种分页模式,只提供思路和实现方式。

热门文章

  1. 再次分享一个多选文件上传方案“.NET研究”
  2. LAMP麻辣网站的搭建
  3. ajax渲染数据到页面_爬虫进阶丨Ajax爬取案例实战
  4. oracle数据库查询如何导出大字段,Oracle数据库导出大字段(CLOB)数据-Oracle
  5. c++ 暂停功能_app下载功能背后的逻辑
  6. lol12月25服务器维护,lol12月10日维护到几点 英雄联盟12月10日10.25版本更新维护时间...
  7. 如何格式化电脑_U盘提示格式化后如何恢复数据
  8. Appdelegate跳转到指定tabbaritem
  9. linux sed 慢,echo/awk/sed的性能问题
  10. mysql 定时计划_MYSQL定时任务