[英]asp.net cache and recycle worker processes
所以我注意到只要工作进程被回收,就会清除HttpContext.Cache
。 我有一个回调,它会在缓存项到期时将其重新插入缓存。 但是,当该过程被回收时,似乎不会发生这种情况。
我在Application_Start
中有一个调用,它将相应的项添加到Cache中,但是在回收工作进程之后似乎没有调用它。 是否有回调我可以用来在回收时重新填充缓存,或者它应该是Application_Start
? 另外,我如何在本地测试?
我很确定我在这里做错了什么。
工作流程回收可以看作停止并启动持有.Net的流程。 所有AppDomain数据都将丢失。
根据我的理解,Application_Start仅在第一个请求到达时执行。 我希望即使在回收后,行为也是一样的。
但如果它没有执行(有趣),那么你总是可以在其他地方触发它。 有很多方法可以做到这一点。 例如Application_BeginRequest或在第一次加载期间引用的任何静态类的ctor。
注意,HttpContext.Cache实际上只是一个静态对象,所以你可以简单地得到一个static bool isInitialized = false;
一旦init完成就会更改,并且它将保留在请求之间。 使用良好的lock() {}
它应该运行顺畅(因此两个请求不会启动两次初始化)。
我通常解决的方法是按需缓存。 不适合所有解决方案。 我还使用Enterprise Framework或AppFabric为缓存设置超时(TTL)。
当AppDomain被回收时,所有程序集都被卸载,因此所有数据都被清除。 当应用程序重新启动时,它本质上就像从头开始,没有办法(据我所知)以这种方式重新填充缓存。
这与停止和启动应用程序不同,后者基本上保存了应用程序的状态,并在重新启动时恢复了之前的状态(包括缓存)。
我唯一能想到的就是禁用应用程序回收,但不建议这样做,因为你最终会遇到不断增加的缓存大小,这将成为一个瓶颈。 您可以将数据持久保存到不同的缓存机制,例如SQL数据库。
CacheItemPriority枚举具有“NotRemovable”选项,可防止在垃圾回收期间从缓存中删除该项。
来自MSDN:
当服务器释放系统内存时,具有此优先级的缓存项不会自动从缓存中删除。 但是,具有此优先级的项目将根据项目的绝对或滑动到期时间与其他项目一起删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.