0

バックエンドに承認とメニュー構造を組み合わせたシステムがあります。パフォーマンス上の理由から、フロントエンド クライアント (MVC rel 1.0 Web サイト、IIS 5.1 ローカル、IIS 6.0 サーバー、クラスターなし) では EntLib キャッシュが使用されます。

「Cache.Contains」が true を返すことがありますが、キャッシュの内容は NULL です。正しく入力したことは確かですが、ここで何が問題になる可能性がありますか?

編集: キャッシュを 1 分に設定し、cacheKey 'A_Key' を追加すると、CurrentCacheState を調べたときにキーが戻ってくることがわかります。2 分後に CurrentCacheState を表示すると、キーはまだそこにあります。'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);
    }
}

そしてキャッシュヘルパー:

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)));
    }
}
4

2 に答える 2

1

マイケルがあなた自身の問題をフォローアップしてくれてありがとう、私はこれに一日中立ち往生していて、キャッシュからアイテムを取得しようとすると、これは期限切れ(+ 0から最大25秒)によるものであり、NULL値を取得することを確認しています。Codeplexは、FAQにあるように、(ある種の)回避策を投稿しています。

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

于 2011-05-03T07:46:05.477 に答える
0

Avanade (Entlib の作成者) から次の応答を受け取りました。

ほとんどの場合、BackgroundScheduler はまだスイープを実行していません。ソース コードを調べる場合、Contains メソッドは、特定のキーがインメモリ キャッシュ ハッシュ テーブルに存在するかどうかのみをチェックしますが、GetData メソッドでは、コードは最初に項目の有効期限が切れているかどうかをチェックし、期限が切れている場合はアイテムがキャッシュから削除されました。

Sarah Urmeneta グローバル テクノロジー & ソリューション Avanade, Inc. entlib.support@avanade.com

その解決策は私のために働いています。それでも、その結果が賢明な方法で使用できない場合に、なぜ「含む」を使用できるのかという疑問が残ります。

よろしく、M.

于 2009-03-24T08:43:31.200 に答える