2009-06-02 18 views
0

いくつかのビジネスオブジェクトをキャッシュする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を使用していますが、コンテキストを破棄しています。

答えて

0

これは、キャッシュ操作を同期しないためです。あなたは、あなたのリストをキャッシュに書き込むことをロックするべきであり(ロック内のリストを取得することさえあるかもしれない)、またそれをキャッシュから取り除くべきである。さもなければ、読み込みと書き込みが同期されていても、Removeの呼び出しの直後に古いListを格納することを妨げるものは何もありません。コード例が必要な場合はお知らせください。

+0

キャッシュはスレッドセーフです – fengd

0

まだ見ていないのであれば、見ている古いデータが何らかの形でViewStateにキャッシュされていないことを確認します。

1

ロードバランシングの目的で複数の本稼働サーバーがないことを確認するようお願いします。その場合、キャッシュ項目を無効化/削除するために、いくつかの外部依存アーキテクチャを使用する必要があります。

0

ユーザー2が新しい要求を送信したことを確認する必要があります。おそらく、見たコンテンツはブラウザのキャッシュであり、サーバーのキャッシュではありません。

関連する問題