我创建了一个运行无限循环的WCF方法,每5分钟轮询一次。它将2个项目写入缓存,我正在检索的主要项目和LAST_POLLED。这是在我们网站的应用程序启动时成功调用的:
//infinite loop
while (true)
{
try
{
_cache.RefreshCache();
WcfCache.SetCache(LAST_POLLED, DateTime.Now);
}
catch(Exception ex)
{
//logging exception to database
}
//essentially polling interval, though dependent on how long it takes to complete task
Thread.Sleep(Polling_DELAY);
}
LAST_POLLED日期时间应该有轮询的时间。但有时,它存储于1月1日,0001。我想这必定是因为缓存消失了。此WCF站点的应用程序池未设置为Recycle NOR是工作进程在空闲后设置为关闭的。这将一次使用几天,但还没有工作整整一周。
答案 0 :(得分:2)
我不确定您使用的缓存类型,但根据定义,事件可能会从cache中消失。缓存用于加速数据访问,而不是数据持久性。
对于数据持久性,您应该使用数据存储。数据存储可以是基于sql的(例如mysql),甚至是键值(no-sql,例如membase)。在这种情况下,这些对你很有帮助。
此外,您似乎正在使用busy-wait。那也是not ideal。
BTW,01-01-0001是DateTime.MinValue。
编辑:
另一个想法#1:你也可以将东西保存在机器的内存中,例如使用静态变量。它不会被持久化或分发,但它可以满足您的需求。
另一个想法#2:我不认为你必须把东西放在缓存中并确保它在5分钟的时间间隔内存在。使用缓存机制的另一种方法如下:
答案 1 :(得分:1)
由于这是一个ASP.Net应用程序,还有其他因素可能导致IIS重新启动应用程序并丢失缓存。
除了你已经提到的内容之外,最有可能的是“触摸”web.config或bin目录中的文件。我们已经看到备份程序,防病毒应用程序和“有用”用户都以这种或那种方式导致此问题。
此外,检查事件日志以查看IIS是否报告应用程序池中的应用程序崩溃也没有什么坏处,这也会导致此问题。
答案 2 :(得分:0)
此博客文章虽然没有专门针对您的主题,但确实提供了一些有关可能导致您的应用资源池被回收的信息。
IIS本身将每29小时回收整个w3wp.exe进程。 它只是直接在w3wp.exe进程中设置上限并将其关闭 所有的应用域都有它。
它还包含一些可以解决您的问题的信息(HostingEnvironment.RegisterObject)