简单来说,b/s结构的应用程序中,为了提高应用程序访问性能,要兼顾数据实时性与访问效率个方面。这就要用缓存这一概念, 除去页输出缓存以外,asp.net 提供了三种缓存机制:
- 其它缓存对象依赖;
- 文件或文件夹依赖;
- 数据库查询依赖。
其中,以数据库查询缓存依赖这一功能是asp.net2.0 中最为强大的一项内容。一旦检测到数据库中的数据表内容有任何变化,它可以使一个cached data object自动失效. 以下是一个小例子:
要使用这个功能,你得了解sqlserver 几种版本的数据库的区别,sqlserver 2005默认是具有这个功能的,而更低版本的,而7.0以上版本,你得用aspnet_regsql.exe 这个功能来做个简单的配置.
以2000版的sqlserver 来说:
vs.net2005命令提示下,如果我想监视我的数据库bookshop 下的book记录基于表,那么就是
aspnet_regsql -S localhost -U sa -P pwd -ed -d bookshop -et -t book
这样就算简单的配置完了(具体参数代表什么内容请查询aspnet_regsql.exe 的帮助内容)
本命令会在数据库中生成系列的新内容,像AspNet_SqlCacheRegisterTableStoredProcedure,
AspNet_SqlCacheUnRegisterTableStoredProcedure,AspNet_SqlCacheUpdateChangeIdStoredProcedure,
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure,AspNet_SqlCachePollingStoredProcedure,
还有在相应的数据下会生成一个AspNet_SqlCacheTablesForChangeNotification表.
不管它。我们接着进入下一步,配置web.config文件
例如:
<system.web>
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="bookshop" connectionStringName="bookshopConnectionString" pollTime="500" />
</databases>
</sqlCacheDependency>
</caching>
.....
这里注意:bookshopConnectionString 是web.config 里面配置的一个连接字符串的名称.
对应上面的语句,我的连接字符串是:
<connectionStrings>
<add name="bookshopConnectionString" connectionString="Data Source=localhost;Initial Catalog=bookshop;Persist Security Info=True;User ID=sa;Password=asen" providerName="System.Data.SqlClient"/>
</connectionStrings>
好了,下面就只剩下编程的细节了。
简单的一个示例:
page_load 里面
if (!IsPostBack)
{
if (HttpContext.Current.Cache["mycache"] == null)
{
string test = "这是测试对象内容";
object o = (object)test;
SqlCacheDependency sqlDependency = new SqlCacheDependency("bookshop", "book");
HttpContext.Current.Cache.Insert("mycache", o, sqlDependency, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration);
}
}
在面页上添加的一个按钮事件处理函数里面:
if (HttpContext.Current.Cache["mycache"]==null)
{
Response.Write("已失效!");
}
else
{
Response.Write(HttpContext.Current.Cache["mycache"].ToString() + "60秒以后过期");
}
这些代码的意思,就是说,Cache["mycache"]里面数据,默认会在自生成起60秒钟内有效,当然,如果在些期间,数据库bookshop里面的表book内容有任何改动,Cache["mycache"]对象将会被从内存中删除掉。
值得注意的一点是
SqlCacheDependency sqlDependency = new SqlCacheDependency("bookshop", "book");
这里的bookshop 是
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="bookshop" connectionStringName="bookshopConnectionString" pollTime="500" />
</databases>
</sqlCacheDependency>
</caching>
这里添加进去的数据名称,后面的book是数据库bookshop里面的表名称.