Sql缓存依赖主要分为两种:
1.轮询模式(poll model)
2.推模式(push model)
今天先讲解第一种模式:轮询
要使用sql轮询模式,得做三方面的工作:
1.对数据库启用缓存依赖
2.对一个或多个表启用缓存依赖
3.在web.config中配置应用程序
一.对数据启用缓存依赖
在visual studio command prompt中执行以下命令
aspnet_regsql -C "Data Souce=localhost;Integrated Security=True;Initial Catalog=SqlTest" -ed
注释:aspnet_regsql是命令行工具 本命令表示启用SqlTest数据库缓存依赖
当执行该命令后,将会在数据库SqlTest中创建表:AspNet_SqlCacheTablesForChangeNotification,如图:
tableName:记录被缓存的表
notificationCreated:记录缓存被创建的时间
changeId:计数器,当表数据修改后,自动增加1
同事创建5个存储过程:
AspNet_SqlCachePollingStoredProcedure
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure
AspNet_SqlCacheRegisterTableStoredProcedure
AspNet_SqlCacheUnRegisterTableStoredProcedure
AspNet_SqlCacheUpdateChangeIdStoredProcedure
二.对数据表启用缓存依赖
在visual studio command prompt中执行以下命令
aspnet_regsql -C "Data Souce=localhost;Integrated Security=True;Initial Catalog=Pubs" -et -t Customers
注释:对Customers表启用缓存依赖
当执行该命令后,将在数据库表AspNet_SqlCacheTablesForChangeNotification中添加一条记录,如图:
三.配置应用程序
[html] view plaincopy
- <caching>
- <sqlCacheDependency enabled="true" pollTime="1000">
- <databases>
- <add name="mydatabase" connectionStringName="pubsConnectionstring"/>
- </databases>
- </sqlCacheDependency>
- </caching>
注释:pollTime设置为1000ms,意思是应用程序按照1s的频率进行轮询,如果数据库表Customers数据被修改,则缓存在1m内失效,重新加载新的数据,然后缓存,知道数据被再次修改,检测数据库表的变化,connectionStringName被设置为要对哪一个数据库进行轮询的数据库连接字符串
此时已经对sql轮询模式已经设置完毕。
四.验证
1.建立页面default.aspx
2.设置缓存:
[html] view plaincopy
- <%@ OutPutCache Duration="20" VaryByParam="none" SqlDependency="mydatabase:Customers" %>
注释:本页面缓存20秒,mydatabase为配置文件中设置sql缓存的项的name值,Customers是要被缓存的表3.页面测试代码如下:
[html] view plaincopy
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title></title>
- </head>
- <body>
- <form id="form1" runat="server">
- <%= DateTime.Now.ToString("T") %>
- <div>
- <asp:GridView runat="server" DataSourceID="srcCustomers" />
- <asp:SqlDataSource
- runat="server"
- ID="srcCustomers"
- ConnectionString="<%$ ConnectionStrings:SqlTestConnstring %>"
- SelectCommand="SELECT * FROM [SqlTest].[dbo].[Customers]" />
- </div>
- </form>
- </body>
- </html>
注意:对属性SqlDependency如果要设置多个表的话,形势如下:
SqlDependency="mydatabase:Customers;mydatabase:Products"
3.运行效果
如果在20s内刷新页面,则时间不会改变,20s后时间被更新,现在我们修改下customers的数据,然后刷新页面,效果如下:
时间被修改,页面展示的Tom也被更新为fred,当数据库的数据修改后,缓存将在1s(配置文件中的PollTime值)被失效。
原理解析:轮询Sql缓存依赖是最灵活的Sql缓存依赖类型,所以推荐使用轮询sql缓存依赖。轮询模式使用的是数据库触发器,当表数据被修改时,触发器被触发,则表AspNet_SqlCacheTablesForChangeNotification中的记录ChangeId字段自定加1。
asp.net framework 使用一个后台线程,用来定期轮询数据库表的修改情况,如果有修改,则依赖于数据库表的缓存项目从缓存中移除。应用程序每次在查询数据时现检测表AspNet_SqlCacheTablesForChangeNotification的记录有没有被修改,如果没有修改则使用缓存中的数据,如果被修改则重新获取数据然后放入缓存中。
好了,今天就到这儿哦,如有错误,请指正!