在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
针对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的校验和函数。下面的查询返回的值会根据表记录的更改而发生变化:
扩展存储过程要实现一种推送模型,以便数据库能将更改消息从后端主动地推送给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数据为例:
运行下面的命令便可启用Customers表的通知功能:
第一条命令会将一个名为AspNet_SqlCacheTablesForChangeNotification的表添加到数据库中,此外,它还会添加一些存储过程和触发器。 第二条命令会对指定的表添加一个触发器,并针对指定的表向AspNet_SqlCacheTablesForChangeNotification表插入一条记录。 触发器在被监视的表发生更改时执行一个存储过程,该存储过程修改表AspNet_SqlCacheTablesForChangeNotification中对应监视表记录的changedId字段,使该字段加1,表示监视表被更改。 SqlCacheDependency配置的最后一步是,修改web.config文件:
pollTime属性用于指示轮询的时间间隔(以ms为单位)。上述代码表示,每秒检查一次被监视的表。 SQL Server依赖项的使用 SqlCacheDependency类有两个构造函数。第一个构造函数接受一个SqlCommand对象,第二个接受两个字符串(数据库名和表名)。第一个构造函数仅适用于SQL Server 2005,而另一个是为SQL Server 2005之前的版本设计。 下面的代码创建了一个SQL Server依赖项,并将其绑定到一个缓存项上:
我们获得的通知是基于整个表的更改。如果某条记录添加到Customers表中,不论该记录country列的值是什么,我们都会得到通知。如果某条country不是USA的记录被修改或删除,也会发出通知。 SQL Server 2005提供了一个出色的控件级别,仅当指定的命令的输出发生更改时。数据库才会将更改通知应用程序。 一旦建立表的通知,使用SqlDataSource控件的页面便可以获得更智能的缓存形式,即它会监视绑定表的更改,并在发生更改时重新加载数据。
为此,我们需要将SqlCacheDependency属性设置为Database:Table形式的字符串。第一项是在<database>区段设置的数据库依赖项名称,第二项是待监视的表名称。我们还可以定义多个依赖项,每个依赖项用分号分隔。 虽然我们仅以SqlDataSource数据源为例,但ObjectDataSource控件亦可使用SqlCacheDependency属性。 针对SQL Server 2005的缓存依赖项 使用SQL Server 2005时不需要进行配置就能直接使用SQL缓存依赖。示例:
SQL Server 2005自带了监视更改的专用组件。它接受一个命令对象,并能够跟踪所有传出的更改,以便检查由该命令返回的结果集是否发生了更改。如果发生更改,该组件会向监听对象推送新的消息。 |
请发表评论