• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ASP.NET3.5核心编程学习笔记(39):SQLServer缓存依赖

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

针对SQL Server的缓存依赖项

  在ASP.NET 2.0及更高版本中,有一个专用的类SqlCacheDependency,该类继承于CacheDependency,支持SQL Server表的依赖项。它兼容于MSDE、SQL Server 7.0和SQL Server的后续版本。

数据库依赖项的内幕

  时至今日,除SQL Server 2005及更高版本外,没有哪个数据库本身能够检测更改的发生。这表明:对于SQL Server 7.0、SQL Server 2000和非SQL Server数据库,必须创建数据库级的基础结构,以便对表的更改做出提示,允许它们被捕获,并将更改通知给ASP.NET缓存。

  数据库缓存失效检测基于两个关键机制:数据库更改检测机制和将更改通知给ASP.NET的机制。为检测更改,触发器是最常用的技术,我们需要建立一个触发器,使其在监视的数据库表发生更改时激活。触发器能捕获表的插入、删除、更新,并对其执行某些操作。具体执行什么操作取决于第二个机制,有两种方案实现:

  1. 通过扩展存储过程调用应用程序特定的HTTP处理程序,处理程序会收到键的值,然后使其所指的缓存项失效,并将其从缓存中移除。

  2. 将缓存的数据与一个磁盘文件建立依赖关系,并通过扩展存储过程修改该文件的时间戳。

  如果不习惯使用触发器,可尝试T-SQL的校验和函数。下面的查询返回的值会根据表记录的更改而发生变化:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM Customers

  扩展存储过程要实现一种推送模型,以便数据库能将更改消息从后端主动地推送给ASP.NET应用程序。

  被监视的数据库要带有一个触发器和一个辅助表,每个被监视的表对应于辅助表中的一条记录,触发器会在指定的表被修改后更新该辅助表。ASP.NET缓存中的自定义组件会对该辅助表进行轮询来检查更改,当该轮询组件检测到指定的表发生更改时,会使相关的缓存项失效,进而删除应用程序使用的数据。

数据库依赖项的启用

  在ASP.NET 2.0和更高版本中,数据库依赖项是通过SqlCacheDependency类实现的。该类兼容于SQL Server 7.0、SQL Server 2000和SQL Server 2005。与SQL Server 2005交互,几乎不需要配置。SQL Server 7.0和SQL Server 2000则不同。先让我们看看如何配置这两种数据库。

  为使SqlCacheDependency开始工作,所有要进行监视的表都要开启通知功能。

  我们可使用命令行工具aspnet_regsql来完成所需的工作。首先要启用数据库的通知功能,然后再逐一为若干数据库表进行这种配置。以Northwind数据为例:

aspnet_regsql -S (local) -U userName -P password -d Northwind -ed

  运行下面的命令便可启用Customers表的通知功能:

aspnet_regsql -S (local) -U userName -P password -d Northwind -et -t Customers

  第一条命令会将一个名为AspNet_SqlCacheTablesForChangeNotification的表添加到数据库中,此外,它还会添加一些存储过程和触发器。

  第二条命令会对指定的表添加一个触发器,并针对指定的表向AspNet_SqlCacheTablesForChangeNotification表插入一条记录。

  触发器在被监视的表发生更改时执行一个存储过程,该存储过程修改表AspNet_SqlCacheTablesForChangeNotification中对应监视表记录的changedId字段,使该字段加1,表示监视表被更改。

  SqlCacheDependency配置的最后一步是,修改web.config文件:

<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="1000" >
<database>
<add name="Northwind" connectionStringName="NWind" />
</database>
</sqlCacheDependency>
</caching>
</system.web>

  pollTime属性用于指示轮询的时间间隔(以ms为单位)。上述代码表示,每秒检查一次被监视的表。

SQL Server依赖项的使用

  SqlCacheDependency类有两个构造函数。第一个构造函数接受一个SqlCommand对象,第二个接受两个字符串(数据库名和表名)。第一个构造函数仅适用于SQL Server 2005,而另一个是为SQL Server 2005之前的版本设计。

  下面的代码创建了一个SQL Server依赖项,并将其绑定到一个缓存项上:

protected void AddToCache(object data)
{
//创建数据库缓存依赖
string database = "Northwind";
string table = "Customers";
SqlCacheDependency dep
= new SqlCacheDependency(database, table);
//创建缓存
Cache.Insert("MyData", data, dep);
}

protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
CustomerCollection data
= Customers.LoadByCountry("USA");
AddToCache(data);
}
}

  我们获得的通知是基于整个表的更改。如果某条记录添加到Customers表中,不论该记录country列的值是什么,我们都会得到通知。如果某条country不是USA的记录被修改或删除,也会发出通知。

  SQL Server 2005提供了一个出色的控件级别,仅当指定的命令的输出发生更改时。数据库才会将更改通知应用程序。

  一旦建立表的通知,使用SqlDataSource控件的页面便可以获得更智能的缓存形式,即它会监视绑定表的更改,并在发生更改时重新加载数据。

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString
="<%$ ConnectionStrings:NWind %>"
SelectCommand
="Select * From Customers"
EnableCaching
="true"
SqlCacheDependency
="Northwind:Customers;Pubs:Authors">
</asp:SqlDataSource>

  为此,我们需要将SqlCacheDependency属性设置为Database:Table形式的字符串。第一项是在<database>区段设置的数据库依赖项名称,第二项是待监视的表名称。我们还可以定义多个依赖项,每个依赖项用分号分隔。

  虽然我们仅以SqlDataSource数据源为例,但ObjectDataSource控件亦可使用SqlCacheDependency属性。

针对SQL Server 2005的缓存依赖项

  使用SQL Server 2005时不需要进行配置就能直接使用SQL缓存依赖。示例:

protected void AddToCache()
{
SqlConnection conn
= new SqlConnection(
ConfigurationManager.ConnectionStrings[
"NWind05"].ConnectionString);
SqlCommand cmd
= new SqlCommand("Select * From Customers Where country='USA'", conn);

SqlDataAdapter adapter
= new SqlDataAdapter(cmd);
DataTable data
= new DataTable();
adapter.Fill(data);

SqlCacheDependency dep
= new SqlCacheDependency(cmd);
Cache.Insert(
"MyData", data, dep);
}

  SQL Server 2005自带了监视更改的专用组件。它接受一个命令对象,并能够跟踪所有传出的更改,以便检查由该命令返回的结果集是否发生了更改。如果发生更改,该组件会向监听对象推送新的消息。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET常用代码发布时间:2022-07-10
下一篇:
ASP.NET Web应用程序修改页面Inherits示例发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap