8

Webアプリケーションを開発していますが、Webリクエスト間でキャッシュを維持したいと考えています。第1レベルのキャッシュはセッションごとのみであることを認識しています。第2レベルのキャッシュを有効にしており、これはクエリに対して機能しています。

ただし、第2レベルのキャッシュはエンティティを「取得」するためには機能しないようです...したがって、アプリケーションが実行するDB作業のほとんどは、Webリクエスト間でキャッシュされていません。

これは正常な/望ましい動作ですか?データベースへのラウンドトリップが多い特定のページを確認していますが、各クエリは高速ですが、エンティティをキャッシュできれば、これらは不要のようです。

編集

さて、私は第2レベルのキャッシュを有効にして、クエリを処理しています。私はそれをエンティティに対して機能させることができないようです。私がCache.Is(c => c.ReadWrite())テストしているメインエンティティには(流暢なnhibernate)があります。しかし、いや、それでも毎回DBにヒットします。何か案は?

編集

私は次のようなトランザクションを使用してみました:

public override Accommodation Get(int id) 
{ 
    using (var tx = Session.BeginTransaction()) 
    { 
        var accomm = Session.Get<Accommodation>(id); 
        tx.Commit(); 
        return accomm; 
    } 
} 

私のマッピングはそのようなものです(そしてあなたは私たちが厄介なスキーマを持っているのを見ることができます):

public void Override(AutoMapping<Core.Entities.Itinerary.Accommodation.Accommodation> mapping)
{
    mapping.HasManyToMany(x => x.Features).Table("AccommodationLinkFeatureType").ChildKeyColumn("FeatureTypeId").NotFound.Ignore();
    mapping.HasManyToMany(x => x.SimilarAccommodation).Table("AccommodationLinkSimilarAccommodation").ChildKeyColumn("SimilarAccommodationId").NotFound.Ignore();
    mapping.HasMany(x => x.TourItinerary).Table("AccommodationTourItinerary");
    mapping.HasOne(x => x.Images).ForeignKey("AccommodationId").Cascade.All().Not.LazyLoad();
    mapping.References(x => x.CollectionType).NotFound.Ignore().Not.LazyLoad();
    mapping.References(x => x.AccommodationUnitType).NotFound.Ignore().Not.LazyLoad();
    Cache.Is(c => c.ReadWrite());
}

ただし、これはまだ2次キャッシュからフェッチしていないようです。

ちなみに、私はオンラインで多くの例を使用していますが、キャッシュヘルパーCache.ReadWrite()のメソッドしか表示できないので、試しています-流暢なインターフェイスは変更されましたか?IsCache.Is(c => c.ReadWrite())

4

3 に答える 3

4

私はこれをテストしていませんが、私の理解では、トランザクションのコミットは、オブジェクトを二次キャッシュに配置する魔法です。トランザクション外で読み取り操作を行っている場合、オブジェクトは第 2 レベルのキャッシュに配置されません。

于 2010-10-13T17:20:01.617 に答える
0

私も同じ問題を抱えていました。私の場合、参照が NotFound().Ignore() でマップされたことが原因でした (つまり、この外部キーでエンティティが見つからない場合は無視してください。これは実際にはデータの一貫性エラーです)。NotFound.Ignore を削除してデータベースを修正します。

于 2011-05-18T11:33:03.460 に答える