我有一个ASP.NET应用程序来缓存一些业务对象。保存新对象时,我在键上调用remove来清除对象。下次用户请求数据时,新列表应该是延迟加载的。
除了不同客户端中缓存的不同视图存在问题。
这是代码的缩短版本:
public static JobCollection JobList
{
get
{
if (HttpRuntime.Cache["JobList"] == null)
{
GetAndCacheJobList();
}
return (JobCollection)HttpRuntime.Cache["JobList"];
}
}
private static void GetAndCacheJobList()
{
using (DataContext context = new DataContext(ConnectionUtil.ConnectionString))
{
var query = from j in context.JobEntities
select j;
JobCollection c = new JobCollection();
foreach (JobEntity i in query)
{
Job newJob = new Job();
....
c.Add(newJob);
}
HttpRuntime.Cache.Insert("JobList", c, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
}
}
public static void SaveJob(Job job, IDbConnection connection)
{
using (DataContext context = new DataContext(connection))
{
JobEntity ent = new JobEntity();
...
context.JobEntities.InsertOnSubmit(ent);
context.SubmitChanges();
HttpRuntime.Cache.Remove("JobList");
}
}
有没有人有任何想法可能会发生这种情况?
编辑:我正在使用Linq2SQL来检索对象,尽管我正在处理上下文。
答案 0 :(得分:1)
我会要求您确保没有多个生产服务器用于负载平衡。在这种情况下,您必须使用一些外部依赖关系体系结构来使缓存项无效/删除。
答案 1 :(得分:0)
那是因为你没有同步缓存操作。您应该锁定将列表写入缓存(甚至可能获取锁内的列表)以及将其从缓存中删除。否则,即使读取和写入是同步的,也没有什么可以阻止在您调用Remove之后立即存储旧List。如果您需要一些代码示例,请告诉我。
答案 2 :(得分:0)
如果你还没有,我还会检查他们看到的旧数据是否在ViewState中以某种方式缓存。
答案 3 :(得分:0)
您必须确保用户2发送了新请求。也许它看到的内容来自它的浏览器缓存,而不是来自服务器的缓存