2

L2キャッシングがどのように機能するかを誤解したのではないかと思います。'HasMany(x => x.Posts)'をキャッシュしようとしていますが、基本的にはその下に多くの投稿があるトピックがあります-トピックマップの上部に以下を追加すると、次のような印象を受けました

Cache.ReadWrite().IncludeAll();

そのキャッシュマップとhasManysは、アプリの基になるデータ変更が再開されるまでですか?L2キャッシュをそのように構成しています

Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("MyAppConString")))
.Cache(c => c.ProviderClass<SysCacheProvider>().UseQueryCache())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<MembershipUserMap>())
Etc…etc..

私のトピックマップには次のものがあります(私はそれを短くするために法線マップの負荷を削除しました)、そしてあなたは投稿でHasManyを見ることができます。

    public TopicMap()
    {
        Cache.ReadWrite().IncludeAll();

        Id(x => x.Id);
        Map(x => x.Name);
        *lots of other normal maps*

        References(x => x.Category).Column("Category_Id");
        References(x => x.User).Column("MembershipUser_Id");
        References(x => x.LastPost).Column("Post_Id").Nullable();

        HasMany(x => x.Posts)
            .Cascade.AllDeleteOrphan().KeyColumn("Topic_Id")
            .Inverse();

    *And a few other HasManys*
    }

したがって、すべてのトピックを取得したら、ループして次のようにします

Topic.Posts.Count()

SqlProfilerを使用すると、各トピックのすべての投稿を取得(最初のヒット)が表示されますが、ページをリロードしても、トピッククエリのすべての取得投稿が表示されますか?

私は何かが足りないのですか?これは今キャッシュする必要があると思いましたか?

4

1 に答える 1

0

Ayendeには、あなたが遭遇したのと同じ問題を説明する良い投稿があります。

基本的に、あなたが持っているのは、投稿自体ではなく、投稿のIDのみをキャッシュすることです。エンティティのキ​​ャッシュを有効にしましたが、のエンティティTopicに対してはおそらく同じことをしなかったことに注意してください。PostPostMap

にも追加Cache.ReadWrite()PostMapます。

他の質問のFetch.Join()ように、で熱心な読み込みを使用している場合、ほとんどの場合、NHibernateはコレクションのキャッシュを正しく実行できないことに注意してください。

これは、キャッシングの非常に優れた概要と、コレクションの積極的な読み込みで発生する可能性のある問題です。

于 2012-07-03T22:22:20.377 に答える