2009-03-23 4 views
0

私は、私たちのバックエンドに統合された承認システムとメンテナンスシステムを持っています。 パフォーマンス上の理由から、EntLibキャッシュはフロントエンドクライアント(MVC rel 1.0 Webサイト、IIS 5.1ローカル、IIS 6.0サーバー、クラスタなし)で使用されます。Entlib Cache.Contains NULLの問題

時には 'Cache.Contains'はtrueを返しますが、キャッシュの内容はNULLです。私はそれを正しく記入していることを確かに知っているので、ここで何が問題になるのでしょうか?

EDIT:キャッシュを1分に設定し、cacheKey 'A_Key'を追加すると、CurrentCacheStateを検査するときにキーが戻ってくるのがわかります。 CurrentCacheStateを2分後に見ると、キーはまだそこにあります。 'contains'を実行するとtrueが返されます。もう一度 'contains'を実行すると、cacheKeyはなくなりました! 同期の問題??

よろしく、 ミシェル

抜粋:

if (IntranetCaching.Cache.Contains(cacheKey)) 
{ 
    menuItems = (List<BoMenuItem>)IntranetCaching.Cache[cacheKey]; 
} 
else 
{ 
    using (AuthorizationServiceProxyHelper authorizationServiceProxyHelper = new AuthorizationServiceProxyHelper()) 
    { 
     menuItems = authorizationServiceProxyHelper.Proxy.SelectMenuByUserAndApplication(APPNAME, userName, AuthorizationType.ENUM_LOGIN); 
     IntranetCaching.Add(cacheKey, menuItems); 
    } 
} 

そしてcachehelper:

public static class IntranetCaching 
{ 
    public static ICacheManager Cache { get; private set; } 

    static IntranetCaching() 
    { 
     Cache = CacheFactory.GetCacheManager(); 
    } 

    public static void Add(string key, object value) 
    { 
     Cache.Add(
      key 
      , value 
      , CacheItemPriority.Normal 
      , null 
      , new Microsoft.Practices.EnterpriseLibrary.Caching.Expirations.AbsoluteTime(TimeSpan.FromMinutes(10))); 
    } 
} 

答えて

0

は私がアバナード(Entlibのクリエイター)から次の応答を得た:

おそらく、 BackgroundScheduler はまだスイープを実行していません。あなたがソース コードを検討するつもり 場合は、特定のキーが インメモリキャッシュハッシュテーブルに存在する場合の方法は、唯一の チェックが含ま GetDataメソッドで、コードを最初にチェック アイテムの有効期限が切れている場合、もししばらくそれは、 アイテムがキャッシュから削除されています。

サラUrmenetaグローバル・テクノロジー・ソリューションズ& アバナード株式会社 [email protected]

ソリューションは私のために働いていること。 結果が賢明な方法で使用できない場合には、「Contains」を使用することができますか?

よろしく、マイケルは自分自身の問題をフォローアップするために、私は私がしようとすると、キャッシュからアイテムを取得する場合、これが期限切れにあることを識別するこの一日で立ち往生されている M.

1

おかげで(+ 0アップ〜25秒)私はNULL値を取得します。 Codeplexはよくある質問(FAQ)にあるように、回避策(種類の)を投稿しました。

a。アイテムをリフレッシュするときに、CacheManagerからnull値を取得しないようにするにはどうすればよいですか? - 断続的に、このような状況に遭遇する可能性があります。この問題を回避するには、ICacheItemExpirationの独自の実装を作成します。 HasExpired()メソッドでは、項目がすでに期限切れになっているかどうかをチェックし、項目の値が期限切れになった場合にその項目の値を更新するロジックを実装します。このメソッドは、項目が期限切れにタグ付けされていない場合は、常にfalseを返す必要があります。 HasExpired()メソッドでfalseを返した結果、アイテムは更新されず、メソッドで実装された更新された値が格納されます。 REF:link

関連する問題