缓存运行原理:一旦你使用了一个具有OutoutCache内容的用户控件,系统会根据控件的创建形式相应的建立新的缓存(看备注)对象,然后在整个缓存周期内一直使用这个新的缓存对象,而不是使用用户控件本身。也就是说页面初此加载时是使用的用户控件本身,接下来在缓存周期内就是使用的缓存对象。因此在页面上动态更改有缓存的控件时会出错,具体的请看http://www.blueidea.com/tech/program/2004/2010.asp
备注:在页中声明并使用了为输出缓存指定的用户控件,则 ASP.NET 页分析器将根据用户控件的创建方式,对两个对象类型中的一个类型进行实例化。如果以声明方式创建用户控件,会添加 StaticPartialCachingControl 对象;如果使用 LoadControl 方法以编程方式创建用户控件,会添加 PartialCachingControl 对象
petshop4为什么更区向于页面缓存,是因为应用程序缓存只缓存业务数据,而页面缓存则能够将业务数据与整个页面放入到缓存中。这种方式比起应用程序缓存而言,在性能上有很大的提高。
以下为自己关于页面缓存的想法
先在页面上加入<%@ OutputCache Duration="100000" VaryByParam="page" %>是为了给整个页面/控件加入缓存
然后在代码页配置CachePolicy.Dependency = DependencyFacade.GetInfoDependency();是为了给这个缓存加入依赖关系.如果这个依赖关系里面的数据有变化,那缓存里写之相关的数据也要变化或者说更新.这个其实跟应用程序缓存差不多一样,只是应用程序缓存是缓存数据.在petshop4中,加入了poxy模式,其实也就是为了判断有没有存在这个缓存,如果没有就从数据库读出来再写入缓存.而在页面加入了缓存本来就确定了该页面一定存在(如果没有这个页面你怎么加页面缓存代码),也就是说页面缓存前提就确定了缓存者的存在.所以就不用像poxy模式那样判断该cach有没有存在等。
页面缓存对于ajax技术的几点反思
页面缓存是缓存了整个页面(包括数据,HTML),缓存后就是一个缓存的整体.我们知道ajax技术就是可以片段更新.所以在页面缓存上用ajax的分页不太成功(个人想法).本来缓存对象就是一个整体了,没办法再把他分成一小块来更新。对于这种情况个人认为用应用程序缓存。因为我们知道应用程序缓存主要是用来缓存数据,换句话说就是一般只用来缓存我们分页的那些数据,这样就不会造成我们说上面说"不能把缓存分成小块来更新"。综上所述页面缓存和应用程序缓存没有哪个最好,只有在什么情况下用哪个最好。