1

NHibernateで2番目のレベルのキャッシュを試しています。このコードで:

return session.Query<Payment>()
    .Cacheable()
    .OrderByDescending(payment => payment.Created)
    .Skip((page - 1)*pageSize)
    .Take(pageSize).ToArray();

エンティティがキャッシュにない場合は、次のようなクエリが実行されます。

select ... from Payment where Id = 1
select ... from Payment where Id = 2
select ... from Payment where Id = 3

100行が返される場合、これらのうち100行が実行されます。つまり、パフォーマンスの大きな問題です。このクエリだけを実行した方がよいでしょう。

select ... from Payment where Id in (1,2,3)

エンティティがキャッシュに存在しないのは、エンティティキャッシュが構成されていないか、キャッシュのサイズが制限されているか、キャッシュ内のエンティティの有効期限が切れているか、キャッシュから削除されていることが原因である可能性があります。

エンティティキャッシュに100%依存することを強制されないように、NHibernateがその「欠落している」エンティティデータをクエリする方法を変更することは可能ですか?

4

2 に答える 2

2

1)エンティティをキャッシュするように NHibernate (自動マッピングで FluentNHibernate を使用) を構成することは可能ですか?

はい、エンティティをキャッシュするように Nhibernate の二次キャッシュを構成することができます。ここを参照

2)キャッシュに 100% 依存することを余儀なくされないようにするために、NHibernate がその「欠落している」エンティティ データを照会する方法を変更することは可能ですか?

設定ファイルで「cache.use_query_cache」プロパティを有効にしましたか?

于 2011-04-27T08:41:51.490 に答える
0

コレクションに対してメイン エンティティと同じキャッシュ ルールを「アクティブ化」するには、同じキャッシュ リージョンを指定する必要があります。それ以外の場合、メイン エンティティのみがキャッシュされ、メイン エンティティが第 2 レベルのキャッシュから読み込まれた場合はコレクションが再度フェッチされます。

これが FluentNhibernate でサポートされているかどうかはわかりませんが、ドキュメントを確認する必要があります。

Collections (Bag) は .Cache(CacheMapping mapping) をサポートしているようです

http://fluentnhibernate.org/api/FluentNHibernate.MappingModel/CacheMapping.htm

于 2011-04-27T13:06:06.233 に答える