【问题标题】:asp.net cache and recycle worker processesasp.net 缓存和回收工作进程
【发布时间】:2011-07-15 22:56:37
【问题描述】:

所以我注意到,每当工作进程被回收时,HttpContext.Cache 就会被清除。我有一个回调,可以在缓存项过期时将其重新插入缓存。但是,当进程被回收时,这似乎不会发生。

我在Application_Start 中有一个调用,它将适当的项目添加到缓存中,但是在工作进程被回收后似乎没有调用它。是否有一个回调我可以用来在回收时重新填充缓存,还是应该是Application_Start?另外,如何在本地进行测试?

我很确定我在这里做错了什么。

【问题讨论】:

  • Application_Start 是执行此操作的正确位置 - 为什么它不起作用我不确定。能看到一些代码就好了。

标签: asp.net caching iis-6


【解决方案1】:

工作进程回收可以看作是停止和启动持有.Net的进程。所有 AppDomain 数据都将丢失。

据我了解,Application_Start 仅在第一个请求到达时执行。我希望即使在回收之后行为也是一样的。

但如果它不执行(有趣),那么您总是可以在其他地方触发它。有很多方法可以做到这一点。例如 Application_BeginRequest 或在首次加载期间引用的任何静态类的 ctor。

请注意,HttpContext.Cache 实际上只是一个静态对象,因此您可以简单地拥有一个 static bool isInitialized = false;,在初始化完成后更改它,它将在请求之间保留。使用正确的lock() {},它应该可以顺利运行(因此两个请求不会启动两个初始化)。

我通常解决的方法是按需缓存。不适用于所有解决方案。我还使用 Enterprise Framework 或 AppFabric 为缓存设置超时 (TTL)。

【讨论】:

  • 好吧,我可以说它没有重新添加回缓存的唯一原因是因为 cacheItem 应该触发一个进行数据库修改的进程。哪些没有完成。
  • 这是一种duh 的回答,我不敢相信我没有想到。 :)
【解决方案2】:

当 AppDomain 被回收时,所有程序集都被卸载,因此所有数据都被清除。当应用重新启动时,基本上就像从头开始一样,没有办法(据我所知)以这种方式重新填充缓存。

这与停止和启动应用程序不同,它基本上保存应用程序的状态,并在重新启动时恢复它以前的状态(包括缓存)。

我唯一能想到的就是禁用应用程序回收,但不建议这样做,因为您最终会遇到不断增加的缓存大小,这将成为瓶颈。您可以将数据持久保存到不同的缓存机制,例如 SQL 数据库。

【讨论】:

    【解决方案3】:

    CacheItemPriority 枚举有一个“NotRemovable”选项,可防止在垃圾回收期间将项目从缓存中删除。

    来自 MSDN:

    具有此优先级的缓存项不会自动 在服务器释放系统内存时从缓存中删除。然而, 具有此优先级的项目与其他项目一起被删除 根据项目的绝对或滑动到期时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-10
      • 2010-12-03
      • 2011-08-18
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2010-09-27
      相关资源
      最近更新 更多