2012-03-08 14 views
0

私はIIS6上で動作するC#(FrameWork 4.0)のアプリケーションを持っています。IIS6で永続的にキャッシュされたデータを取得する方法

というデータデータを永続的にキャッシュしたいのですが、このキャッシュされたデータをイベントやそれに類するものを短時間(15-25分)で削除します。

は、私はこのオプションのみでIISを設定します(分単位)ワーカープロセスのリサイクル1740

キャッシュされたデータを保存するための任意のアイデアを? 静的変数のファイル時間はアプリケーションの有効期間と同じですか?

public class CacheUsers 
{ 
     static object objlock; 
     private static List<Users> usersList { get; set; } 
     private static DateTime lastUpdate; 

     public CacheUsers() 
     { 
      if (objlock == null) 
      { 
       objlock = new object(); 
      } 
      lock (objlock) 
      { 
       if (usersList == null || usersList.Count.Equals(0) || (lastUpdate < DateTime.Now.AddHours(-24))) 
       { 
        UpdateUserList(); 
       } 
      } 
     } 

     public static List<Users> ListaCacheada 
     { 
      get 
      { 
       if (usersList == null || usersList.Count.Equals(0) || (lastUpdate < DateTime.Now.AddHours(-24))) 
       { 
        UpdateUserList(); 
       } 
       return usersList; 
      } 
     } 

     /// <summary> 
     /// Refresh the user list 
     /// </summary> 
     private static void UpdateUserList() 
     { 
      usersList = GetUsers(); 
      lastUpdate = DateTime.Now; 
     } 

} 
+0

ここで、あなたは 'CacheUsers'をインスタンス化しますか? – Matthew

+0

だから、アプリケーションプールのリサイクル後にデータを表示したいのですか? –

+0

2.はい、もちろん、私はアプリケーションプールのリサイクル後のデータを持っていると思いますが、これが目的です。 –

答えて

1

編集:どのくらいのオブジェクト生き残ることができます - ASP.Netでそれはの変化によって引き起こされることができ

のアプリケーションドメインでのCLRオブジェクトは、そのアプリケーションドメインの再起動を生き残ることができるため技術的に方法はありません(つまり、結果として、AppPoolのリサイクル(プロセスシャットダウン)を生き残ることはできません。ネイティブオブジェクトはAppPoolリサイクルでも存続できません。

AppPoolをリサイクルする必要はありません。プロセスを再作成します(実際には実行されません)。このAppPoolによって処理されるサイトへの最初のリクエストのみがプロセスを起動します。

あなたの目標が厳密に「私のCLRオブジェクトは、AppPoolリサイクル直後に何らかのキャッシュに入れられていなければなりません」というのは、Application_Start(またはモジュール内の同等のメソッド)のオブジェクトを再キャッシュすることです。静的オブジェクトはアセンブリのロード時に作成されることが保証されていないので、静的オブジェクトをキャッシュに使用する場合は、作成をトリガする必要があります。つまりApplication_Startでアクセスします。

オブジェクトがAppPoolの有効期間を超えて存在する必要がある場合は、別のサービスが必要です。このようなシステムでは、オブジェクトをプロセス(および時にはマシン)の外に置かなければならないため、そのようなオブジェクトにリモートからアクセスするコストを支払うことになります。

分散キャッシング(memcachdなど)に興味があり、ニーズに合っているかどうかを確認することができます。


通常「キャッシング」の使用は、作成にコストがかかるオブジェクトをキャッシュすることで、それは不明であるあなたの「キャッシュされた」の定義を達成したいです。

それは多くの場合、オブジェクトを提供してメソッド内でキャッシュロジックを隠すことによって行われます。

MyObject GetMyObject() 
{ 
    MyObject result= cacheProvider.Get("cacheId_MyObject"); 
    if (result = null) 
    { 
    result = VerySlowMethodToCreateMyObject(); 
    cacheProvider.Cache("cacheId_MyObject", result); 
    } 
    return result; 
} 

は単にSystem.Web.Caching.Cacheを使用することを検討してください。そのInsertメソッドは多くのオプションを提供します。 onRemoveCallbackを提供する場合は、「キャッシュされた永遠」アイテムを実装することもできます。

+0

多くのポストディフェンディング静的変数vs Caching.Cache –

+0

私は[リンク] http://stackoverflow.com/questions/6922763/httpruntime-cache-vs-sta---tic-dictionary-fieldsを読んで、 HashTable内のオブジェクトは、アプリケーションプールが稼動している間は有効です(手動でエントリを削除しない限り)。 –

0

私はコードを変更しました。私はHttpRuntime.Cacheを使用しますが、何も起こりません。:-(

問題があるためアプリケーションプールでのみ、1日1回のみ動作するべきであるということです。私は、このオプションを使用してIISを構成

:ワーカープロセスのリサイクルを(分単位)1740

とは何かが、このプロセスを何回(およそ10mlの液体フッ化水素を圧入、15分ごと)の多くを立ち上げているようだ。

私はアプリケーションプールのリサイクルを停止したい。私はそれを行うことができます

public class CacheUsers 
    {   
     static object objlock;   
     private static List<Users> usersList { get; set; }   


    public CacheUsers()   
    {    
     if (objlock == null)    
     {     
      objlock = new object();    
     }    
     lock (objlock)    
     {     
      if (usersList == null || usersList.Count.Equals(0))     
      {      
       UpdateUserList();     
      }    
     }   
    } 

    private static void UpdateUserList()   
    {   
       usersList = GetList(); 
       HttpRuntime.Cache.Insert("Key", usersList , null, 
          Cache.NoAbsoluteExpiration, 
          Cache.NoSlidingExpiration, 
          System.Web.Caching.CacheItemPriority.NotRemovable, 
          ReportRemovedCallback 
          );    
    }  




} 

ReportRemovedCallbackは、この原因を示します。削除されました。しかし、それは誰ですか?

関連する問題