5

nHibernate 実装には、多数のキャッシュ領域が設定されています。負荷分散された Web サーバーでの問題を回避するために、キャッシュされたデータを編集するページのキャッシュを効果的に無効にしたいと考えています。すべてのクエリ キャッシュ、クラス キャッシュ、およびエンティティ キャッシュを簡単にクリアするメソッドを作成できます。

しかし、私が本当に望んでいるのは、地域ごとにキャッシュをクリアすることです。sessionFactory.EvictQueries() はリージョン パラメータを受け取りますが、Evict() と EvictCollection() は受け取りません。ここでキャッシュ全体を破棄したくはありませんし、タイプとキャッシュ領域を関連付けるある種のぎこちない辞書を維持したくもありません。nHibernate には、エンティティまたはコレクションにキャッシュ設定を尋ねる方法がありますか?

ありがとう

4

2 に答える 2

5

私はちょうど同じことをしました。皆の利益のために、これが私が構築した方法です:

public void ClearCache(string regionName)
    {
        // Use your favourite IOC to get to the session factory
        var sessionFactory = ObjectFactory.GetInstance<ISessionFactory>();

        sessionFactory.EvictQueries(regionName);

        foreach (var collectionMetaData in sessionFactory.GetAllCollectionMetadata().Values)
        {
            var collectionPersister = collectionMetaData as NHibernate.Persister.Collection.ICollectionPersister;
            if (collectionPersister != null)
            {
                if ((collectionPersister.Cache != null) && (collectionPersister.Cache.RegionName == regionName))
                {
                    sessionFactory.EvictCollection(collectionPersister.Role);
                }
            }
        }

        foreach (var classMetaData in sessionFactory.GetAllClassMetadata().Values)
        {
            var entityPersister = classMetaData as NHibernate.Persister.Entity.IEntityPersister;
            if (entityPersister != null)
            {
                if ((entityPersister.Cache != null) && (entityPersister.Cache.RegionName == regionName))
                {
                    sessionFactory.EvictEntity(entityPersister.EntityName);
                }
            }
        }
    }
于 2012-06-18T06:40:42.157 に答える
0

OK、私は自分の質問に答えたようです。nHibernate メタデータを引き出したときに返される既定のインターフェイスは、キャッシュに関する情報を提供しませんが、その実装を掘り下げると、提供されます。少し不器用ですが、それは仕事をします。

于 2012-02-27T13:43:38.270 に答える