いくつかのビジネスオブジェクトをキャッシュするASP.NETアプリケーションがあります。新しいオブジェクトが保存されると、キーを削除してオブジェクトをクリアするよう呼び出されます。新しいリストは、ユーザーが次にデータを要求したときに遅延ロードする必要があります。ASP.NETキャッシュ - 削除(「キー」)が機能しない状況?
異なるクライアントのキャッシュのビューが異なる場合を除いて、問題があります。
- 2人のユーザーは、新しいオブジェクトがユーザー1で保存され、キャッシュは、ユーザー1はまた
- ユーザー2を使用しているデータの日付ビューまでを見て
- 削除されるサイト
- を閲覧していますサイトでは、しかし、ユーザー1が新しいオブジェクトを保存した後、何らかの理由で新しいキャッシュされたデータを見ていない - 彼らは古いリストを参照し続け
このコードの短縮バージョンは次のとおりです。
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を使用していますが、コンテキストを破棄しています。
キャッシュはスレッドセーフです – fengd