Sql缓存依赖

来源:互联网 发布:js监听手机输入法关闭 编辑:程序博客网 时间:2024/05/02 05:04

 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中添加一条记录,如图:


三.配置应用程序

 <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.设置缓存:

<%@ OutPutCache Duration="20" VaryByParam="none" SqlDependency="mydatabase:Customers" %>
注释:本页面缓存20秒,mydatabase为配置文件中设置sql缓存的项的name值,Customers是要被缓存的表3.页面测试代码如下:
<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的记录有没有被修改,如果没有修改则使用缓存中的数据,如果被修改则重新获取数据然后放入缓存中。

好了,今天就到这儿哦,如有错误,请指正!