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  配置文件

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

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

 1.3   SqlCacheDependencyAdmin使用

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Web.Caching;
  8. using System.Configuration;
  9. using System.Data.SqlClient;
  10. namespace TestWebSqlCacheDependency
  11. {
  12. public partial class _Default : System.Web.UI.Page
  13. {
  14. string key = "model_type";
  15. protected void Page_Load(object sender, EventArgs e)
  16. {
  17. TextBox1.Text = test();// test();
  18. }
  19. private string test()
  20. {
  21. //从缓存中取值
  22. string model = null;
  23. if (HttpRuntime.Cache[key] != null)
  24. {
  25. model = HttpRuntime.Cache[key].ToString();
  26. }
  27. if (model == null)
  28. {
  29. //取数据
  30. model = getDBValue();
  31. //启用更改通知
  32. SqlCacheDependencyAdmin.EnableNotifications(
  33. ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString);
  34. //连接到 SQL Server 数据库并为 SqlCacheDependency 更改通知准备数据库表
  35. SqlCacheDependencyAdmin.EnableTableForNotifications(
  36. ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString, "TableTest");//第二个参数是要监控的表名称
  37.  
  38. //制定缓存策略
  39. SqlCacheDependency scd = new SqlCacheDependency("Pubs", "TableTest");
  40. //注意此处的Pubs需要要配置文件的caching节下的databases节下的name对应,而不是随便写的,目前个人测试的结论就是这样。第二个参数是要监控的表名称
  41. //插入缓存
  42. HttpRuntime.Cache.Insert(key, model, scd);
  43. }
  44. return model;
  45. }
  46. private string getDBValue()
  47. {
  48. SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString);
  49. cn.Open();
  50. SqlCommand cd = cn.CreateCommand();
  51. cd.CommandText = " select top 1 TableTest.col2 from TableTest ";
  52. object o = cd.ExecuteScalar();
  53. cn.Close();
  54. if (o != null)
  55. {
  56. return o.ToString();
  57. }
  58. return null;
  59. }
  60. }
  61. }

轮询模式的实质,就是在数据库中多了一个表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中,例如:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.SessionState;
  7. using System.Data.SqlClient;
  8. using System.Web.Caching;
  9. namespace WebTest2
  10. {
  11. public class Global : System.Web.HttpApplication
  12. {
  13.  
  14. void Application_Start(object sender, EventArgs e)
  15. {
  16. #region SQL2005
  17.  
  18. SqlDependency.Start(ConnectionString_SQL2005);//推荐将这段代码加到Global.asax的Application_Start方法中
  19.  
  20. #endregion
  21. }
  22.  
  23. void Application_End(object sender, EventArgs e)
  24. {
  25.  
  26. SqlDependency.Stop(ConnectionString_SQL2005);
  27.  
  28. }
  29. }
  30. }

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

2.3  使用

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System;
  8. using System.Configuration;
  9. using System.Collections.Generic;
  10. using System.Data;
  11. using System.Data.SqlClient;
  12. using System.Web;
  13. using System.Web.UI;
  14. using System.Web.UI.WebControls;
  15. using System.Web.Caching;
  16. namespace WebTest2
  17. {
  18. public partial class _Default : System.Web.UI.Page
  19. {
  20. protected void Page_Load(object sender, EventArgs e)
  21. {
  22. DataTable dt = HttpRuntime.Cache["dt"] as DataTable;
  23. if (dt == null)
  24. {
  25. using (SqlConnection sqlCon = new SqlConnection(WebConfigHelper.ConnectionString_SQL2005))
  26. {
  27. sqlCon.Open();
  28. SqlCommand sqlCmd = new SqlCommand();
  29. sqlCmd.Connection = sqlCon;
  30. sqlCmd.CommandText = "select col2 from dbo.TableTest";
  31. dt = new DataTable();
  32. SqlCacheDependency scd = new SqlCacheDependency(sqlCmd);
  33. SqlDataAdapter sda = new SqlDataAdapter(sqlCmd);
  34. sda.Fill(dt);
  35. HttpRuntime.Cache.Insert("dt", dt, scd);
  36. sqlCon.Close();
  37. }
  38. }
  39. GridView1.DataSource = dt;
  40. GridView1.DataBind();
  41. }
  42. }
  43. }

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

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

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

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

SQL Server SqlCacheDependency 缓存依赖的更多相关文章

  1. SQL server数据缓存依赖

    SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持        主要包含以下几 ...

  2. 对MySql查询缓存及SQL Server过程缓存的理解及总结

    一.MySql的Query Cache 1.Query Cache MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集.MySql在实现Query Cache的 ...

  3. SQL Server 数据缓存

    引言 SQL Server通过一些工具来监控数据,其中之一的方法就是动态管理管理视图(DMV). 常规动态服务器管理对象 dm_db_*:数据库和数据库对象 dm_exec_*:执行用户代码和关联的连 ...

  4. SQL server 清除缓存

    在进行性能分析的时候有时候需要清除缓存以便进行下一次分析. SQL Server提供了一些工具来清除缓存的性能数据.使用下面的语句来完成这些任务. 清除全局缓存使用下面的语句: DBCC DROPCL ...

  5. sql server 清理缓存

    -1. 将当前数据库的全部脏页写入磁盘.“脏页”是已输入缓存区高速缓存且已修改但尚未写入磁盘的数据页. --   CHECKPOINT 可创建一个检查点,在该点保证全部脏页都已写入磁盘,从而在以后的恢 ...

  6. Asp.net mvc+EF+Sql Server2008数据库缓存依赖

    1.开启数据库缓存依赖功能(开启对数据库中表Article和ArticleType的缓存) (注:)如果要配置SqlCacheDependency,则需要以命令行的方式执行. aspnet_regsq ...

  7. asp.net mvc5中使用缓存依赖SqlCacheDependency

    缓存是用来提高应用性能,降低服务器压力.适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存.使用缓存最麻烦的就是保持源数据和缓存的中的数据一致. 缓存(Cache) ...

  8. SQL数据缓存依赖总结

    以前只听过SQL server数据缓存依赖,但一直没使用,由于项目需要,才研究了一番,发现了一个很诡异的问题,竟然是一个操作顺序问题导致的. SQL server数据缓存依赖有两种实现模式,轮询模式, ...

  9. C#中缓存的简单方法及使用Sql设置缓存依赖项

    概述 使用Cache高速缓存可以提高数据的读取速度,减少服务器与客户端之间的数据交互.因为Cache一经创建就会占用服务器上的资源,所以Cache并不是越多越好,一般用于数据较固定,使用较频繁的地方. ...

随机推荐

  1. React 回忆录(二)为什么使用 React?

    Hi 各位,欢迎来到 React 回忆录!

  2. mbr看图

  3. 卸载vs2017

    卸载enterprise版本 Microsoft.FSharp.SDK.Core卸载失败Package 'Microsoft.FSharp.SDK.Core,version=15.7.20180605 ...

  4. 51nod 1082 与7无关的数

    暴力 打表过的 注意爆int 还有 7的倍数 和 数字中有7的 #include<bits/stdc++.h> using namespace std; typedef long long ...

  5. ASP.NET MVC之Bundle压缩JS和CSS

    介绍Bundle之前先引用<淘宝技术这十年>中一段话,对Web前端稍微有点常识的人都应该知道,浏览器下一步会加载页面中用到的CSS.JS(JavaScript).图片等样式.脚本和资源文件 ...

  6. 对Tomcat启动或运行时,项目对jar包依赖路径的一些粗浅认知

    Tomcat在运行webapp项目的时候,需要各种依赖jar包.它会从2个地方去找这些包 1.Tomcat自己的lib目录中 2.webapp目录下,webapps\{项目}\WEB-INF\lib ...

  7. POJ 1509 Glass Beads---最小表示法

    题意: T组数据,每组数据给出一个字符串,求这个字符串的最小表示发(只要求输出起始位置坐标) SAM入门题(检测板子是否正确). 将字符串S加倍丢进SAM中,然后走字符串长度次,每次贪心的沿最小的边走 ...

  8. 一个对iBatis的总结写的不错(转载)

    转载自:http://blog.csdn.net/panxueji/article/details/9852795 一. ibatis介绍 ibatis始于2002年,2010年更名为mybatis, ...

  9. Codeforces Round #189 (Div. 2) D. Psychos in a Line 单调队列dp

    D. Psychos in a Line time limit per test 1 second memory limit per test 256 megabytes input standard ...

  10. 安装cartographer_ros

    这里使用的是hitcm(张明明)的github地址,由于google官方的教程需要FQ下载一些文件,因此容易失败,经验证hitcm(张明明)对原文件进行了少许修改后可以成功安装,在他的修改中核心代码不 ...