系列目录:
SqlCacheDependency使用轮流检测技术(轮询)使缓存无效
-------------------------------------------------------------------------------------------------
在Sql Server 7及后继版本中都可以使用轮流检测技术(轮询)使缓存无效,但只有Sql Server 7和Sql server 2000支持这种技术。如查是Sql Server2005及后继版本可以使用查询(命令)通知技术来使缓存无效。
用法
1、在配置轮流检测技术时,首先要配置每个要进行检测的Sql Server数据库,然后配置要进行检测的每个表。
1)配置数据库
格式:
例:配置本机的NhibernateSample数据库
说明:执行此命令后,会在指定的数据库中会新建一个“AspNet_SqlCacheTablesForChangeNotification”表。
网上看到另外一个格式,如下。
2)配置表
格式:
例:配置本机NhibernateSample数据库的Customer表
说明:执行此命令后,会在表“AspNet_SqlCacheTablesForChangeNotification”中添加一行,并在Customer表上建立有关Insert、Update、Delete的触发器。
网上看到另外一种格式,如下。
关闭此表的通知为:
如果觉得手工建立麻烦。也可在程序中使用代码来替代。代码如下:
SqlCacheDependencyAdmin.EnableNotifications(
ConfigurationManager.ConnectionStrings["NHibernateSampleDb"].ConnectionString);
//初检测数据库中要检测的表
SqlCacheDependencyAdmin.EnableTableForNotifications(
ConfigurationManager.ConnectionStrings["NHibernateSampleDb"].ConnectionString, "Customer");
2、编写程序。
下边程序一个Asp.net程序。所以需要配置web.config.要配置的地方如下。 注意下边加粗的部分。
<add name="NHibernateSampleDb" providerName="System.Data.SqlClient"
connectionString="Data Source=.; Initial Catalog=NHibernateSample;
Persist Security Info=True;User ID=sa;Password=123"/>
</connectionStrings>
<system.web>
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="CacheDependency_NHibernateSampleDb" connectionStringName="NHibernateSampleDb" pollTime="5000"/>
</databases>
</sqlCacheDependency>
</caching>
</system.web>
页面上添加OutputCache,用于缓存页面。并依赖于SqlCacheDependency。页面源码如下。
Inherits="SqlDependencyInAspNet.CacheDependencyPage" %>
<% @ OutputCache Duration ="9999" VaryByParam ="None" SqlDependency ="CacheDependency_NHibernateSampleDb:Customer" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
编写代码如下,注意加粗部分。
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data;
using System.Web.Caching;
namespace SqlDependencyInAspNet
{
public partial class AggregateCacheDependencyUse : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetData();
}
}
private void GetData()
{
string cacheData = "内容";
if (Cache["data"] == null)
{
//要检测的数据库
SqlCacheDependencyAdmin.EnableNotifications(
ConfigurationManager.ConnectionStrings["NHibernateSampleDb"].ConnectionString);
//初检测数据库中要检测的表
SqlCacheDependencyAdmin.EnableTableForNotifications(
ConfigurationManager.ConnectionStrings["NHibernateSampleDb"].ConnectionString, "Customer");
SqlCacheDependency scd = new SqlCacheDependency("CacheDependency_NHibernateSampleDb", "Customer");
Cache.Insert("data", cacheData, scd);
//此处可以加入自己的其它方法,如重新从数据库取得资料
Response.Write("取用新的内容");
}
else
{
cacheData = (string)Cache["data"];
Response.Write("调用Cache内容");
}
Response.Write(cacheData);
}
}
}
最后测试。启动程序后刷新,程序将会中缓存中取数据。修改数据库中表Customer,然后刷新,这次将重新取数据,OutputCache也将随之实更新。