SqlDataSource控件还要把EnableCaching属性设置为true,这样会使SqlDataSource自动地缓冲通过SelectCommand检索的数据。这个CacheDuration属性能够使你指定(以秒为单位)在数据从数据库中刷新之前应该被缓冲多长时间。默认情况下,SqlDataSource将使用一种绝对过期策略来缓存数据;这意味着,数据每隔在CacheDuration属性中指定的秒数刷新一次。
你还可以选择性配置让SqlDataSource使用一种“滑动式”过期策略。通过这种策略,只要数据继续被存取,它就不会被删除。当你有大量需要被缓冲的项时,使用滑动过期策略非常有用,因为该策略能够使你在内存中仅保持被最频繁访问的项。在上面的示例中,通过分别把EnableCaching和CacheDuration属性设置为True和10,你缓冲SQL查询结果的时间期限为10秒。
在SqlDataSource控件中的SQL缓存无效
到目前为止,你已看到了如何使基于在SqlDataSource控件中的CacheDuration属性中设定的持续时间值缓存无效。在本节中,我将解释基于SQL Server表中的数据实现一个缓存无效机制的步骤。这种缓存无效机制是ASP.NET 2.0的一个新特征,这时一个缓冲页面或一个数据源控件能够被绑定到一个SQL Server数据库中的某一个特定表上。一旦你实现这种初始化的关联操作,那么,改变该表的内容将导致缓冲的对象自动无效。
【建议】当你需要在多个页面中使用相同的数据库数据时,你应该考虑使用数据源控件的SQL缓存无效机制。
其实,基于SQL Server的缓存无效机制适用于SQL Server 7.0及以上版本;但是,SQL Server 7.0和2000仅支持表级的缓存无效机制。这意味着,当任何时间表中的数据改变时,缓冲的项被自动地无效。SQL Server 2005还提供了一种行级缓存无效机制,这可以在一种更细的级别上来控制缓冲数据。
在SQL Server 7和SQL Server 2000中,表级缓存无效是通过使用一种查询系统(一个特定的ASP.NET进程)支持的。该进程每隔特定的时间查询数据库(“拉”模型)以监视自从上次被检查以来哪些表发生了变化。尽管这种拉模型能够适合于大多数情形,但是它并不是一种非常有效的方法。幸好,这种情形在SQL Server 2005中得到了大大增强—无论何时修改一个特定的数据行,实际上都由SQL Server负责通知(推模型)ASP.NET。SQL Server 2005通过使用一个称为通知提交服务(Notification Delivery Services,它使用80端口)的特征实现这一功能,该服务能够直接与IIS6.0的HTTP.SYS进行交互以通知Web服务器更新特定的行。接下来,我将解释如何为SQL Server 7和2000版本配置缓冲。
在你能够使用SQL Server 7或SQL Server 2000建立缓存依赖性之前,你需要完成下列步骤:
◆配置SQL Server以支持SQL缓存无效。这只需要一次性建立你想监视的SQL Server数据库中的表或数据库即可。
◆把必要的配置信息添加到web.config文件。
下面,让我们详细分析上面的步骤。首先,我们来看一下SQL Server的配置问题。
四、配置SQL Server以支持SQL缓存无效
你可以以下列两种方式实现SQL Server 2000配置以支持SQL缓存无效:
1.使用aspnet_regsql工具;
2.使用SqlCacheDependencyAdmin类的EnableTableForNotifications方法。
在本文中,我们仅考虑第一种方法。上面的aspnet_regsql工具负责创建另外一个表AspNet_SqlCacheTablesForChangeNotification,用于跟踪改变数据库中的所有被监视的表的变化;它还创建一组触发器和存储过程来支持这种能力。为了运行aspnet_regsql工具,只需打开Visual Studio命令提示行,然后输入类似下列的命令:
|
运行正常的话,应该显示如下:
|
该命令使Pubs数据库支持SQL缓存无效功能。其中:
◆S—服务器名
◆U—用于连接到SQL Server的用户ID
◆P—用于连接到SQL Server的用户口令
◆d—数据库名
◆ed—支持该数据库具有SQL Server触发的缓存无效功能
一旦在数据库级上完成上面的操作,接下来,你需要在单个表级上启动缓存无效功能。具体实现请参考下列命令:
|
运行正常的话,应该显示如下:
|
在上面的命令中:
◆t—指定表的名称
◆et—支持该表具有SQL Server触发的缓存无效功能
上面的命令展示了如何为Pubs数据库中的authors表启动SQL缓存无效支持。一旦你配置好authors表可以发送通知,那么,任何时候该表中的数据变化时,它都会通知ASP.NET使位于缓存中的相应的项无效。