SQL Server SqlCacheDependency 缓存依赖
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 缓存依赖相关推荐
- SQL server数据缓存依赖
为什么80%的码农都做不了架构师?>>> SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1 轮询模式实现步骤 此模式需要SQL SERVER 7.0/ ...
- 【状态保持】Cache 基于SQL 数据库 的缓存依赖 轮询机制详解
首先声明一下如果您还不了解什么是Cache(缓存)请您先搜一下有关信息然后再看这篇文章. 当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础.应用程序可以通过两种途径获 ...
- sql server 缓存_深入了解SQL Server缓冲区缓存
sql server 缓存 When we talk about memory usage in SQL Server, we are often referring to the buffer ca ...
- 优化SQL Server的内存占用之执行缓存
优化SQL Server的内存占用之执行缓存篇 优化SQL Server的内存占用之执行缓存 在论坛上常见有朋友抱怨,说SQL Server太吃内存了.这里笔者根据经验简单介绍一下内存相关的调优知识. ...
- 浅谈SQL Server 对于内存的管理
简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...
- SQL Server代理(4/12):配置数据库邮件
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在以前的文章里我们看到,SQL Serve ...
- SQL Server索引总结二
从CREATE开始 通过显式的CREATE INDEX命令 在创建约束时作为隐含的对象 随约束创建的隐含索引 当向表中添加如下两种约束之一时,就会创建隐含索引. 主键约束(聚集索引) 唯一约束(唯一索 ...
- Microsoft SQL Server 2000整合规划
Microsoft SQL Server 2000整合规划 更新日期: 2004年06月24日 SQL Server技术文章 作者:Allan Hirt 投稿人:Tom Davidson和Shaun ...
- sql server 跟踪_SQL Server跟踪标志指南; 从-1到840
sql server 跟踪 SQL Server trace flags are configuration handles that can be used to enable or disable ...
最新文章
- Leetcode264. Ugly Number II丑数2
- 好文转载—程序员在工作中会追求什么?
- 字节跳动践行节能减排,数据中心能效居行业前列
- 51单片机按键控制数码管0~9_51单片机外部中断
- 【转】WPF调用图片路径,或资源图片
- java编写一个集合类_Java集合类
- 新一季“十大最堵互联网公司”出炉:360百度腾讯跻身三甲
- select - I/O多路复用
- 把列表中的0全部移到后面,非零元素出现的顺序不变,要求在原列表上进行.
- 一大波PyTorch图像分割模型来袭,俄罗斯程序员出品新model zoo
- java scala中传递变长参数
- android游戏菜鸟教程,菜鸟教程app
- Oracle彻底卸载干净教程
- Android Studio ADB 环境变量配置
- 串口服务器通讯协议,串口服务器的组成和应用实例
- Swift 之横竖屏切换
- 管理与维护Linux系统
- 计算机怎么取消u盘启动程序,如何设置电脑启动项的为U盘启动,小编教你如何设置电脑启动项的为U盘启动...
- 树莓派raspios(原raspbian)下载地址
- iOS开发 - 商品详情页两种分页模式,只提供思路和实现方式。
热门文章
- 再次分享一个多选文件上传方案“.NET研究”
- LAMP麻辣网站的搭建
- ajax渲染数据到页面_爬虫进阶丨Ajax爬取案例实战
- oracle数据库查询如何导出大字段,Oracle数据库导出大字段(CLOB)数据-Oracle
- c++ 暂停功能_app下载功能背后的逻辑
- lol12月25服务器维护,lol12月10日维护到几点 英雄联盟12月10日10.25版本更新维护时间...
- 如何格式化电脑_U盘提示格式化后如何恢复数据
- Appdelegate跳转到指定tabbaritem
- linux sed 慢,echo/awk/sed的性能问题
- mysql 定时计划_MYSQL定时任务