29

セットアップ方法と流暢な nhibernate でキャッシュするエンティティの例を誰かが持っていますか。流暢なマッピングと自動マッピングの両方を使用していますか?

1 対多と多対多の両方のエンティティ関係についても同じでしょうか?

4

1 に答える 1

33

私は、特定の要素をキャッシュしたいだけで、これらの要素を起動時に一度ロードし、アプリケーションがシャットダウンされるまでキャッシュに保持したいという同様の状況に取り組んできました。これは読み取り専用のキャッシュであり、ユーザーがリストから自分の国を選択できるように、国のリストを作成するために使用されます。

fluentNhibernate マッピングを使用し、Country クラスを Cache.readonly() で定義しました。

public class CountryMap : ClassMap<Country> {
    public CountryMap() { 
         Schema("Dropdowns");
         Cache.ReadOnly();
         // Class mappings underneath 
    }
}

私のユーザー クラス マップは次のようになります。

public class UserMap : ClassMap<User> {
    Id(x => x.Id).Column("UserId");
    Map(x => x.FirstName);
    Map(x => x.LastName);
    References(x => x.Country)
      .Column("CountryId");
}

第 2 レベルのキャッシュを使用するように Fluent Nhibernate を手動で構成します。したがって、私の流暢な構成では、次のようになります。

var sessionFactory = Fluently.Configure()
    .Database (...) // set up db here
    .Mappings(...)  //set up mapping here
    .ExposeConfiguration(c => {
        // People advice not to use NHibernate.Cache.HashtableCacheProvider for production
        c.SetProperty("cache.provider_class", "NHibernate.Cache.HashtableCacheProvider");
        c.SetProperty("cache.use_second_level_cache", "true");
        c.SetProperty("cache.use_query_cache", "true");
    })
    .BuildSessionFactory();

SQL プロファイラーをチェックインしました。ユーザーの国のリストを取得すると、それらが 1 回読み込まれ、他のすべてのリクエストの後にキャッシュ ヒットが取得されます。良い点は、ユーザーの国名を表示するときにキャッシュから読み込まれ、データベースにリクエストを行わないことです。Gabriel Schenkerによるこの投稿からいくつかのヒントを得ました。それが役立つことを願っていますか?より良い/適切な方法を見つけた場合は、お知らせください。ありがとう!

于 2009-11-24T11:50:17.733 に答える