您的位置:首页 > 数据库

Sql缓存依赖

2012-06-29 23:07 344 查看

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的记录有没有被修改,如果没有修改则使用缓存中的数据,如果被修改则重新获取数据然后放入缓存中。

好了,今天就到这儿哦,如有错误,请指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: