2012-03-29 6 views
1

Linq式を使用して私のNHibernateデータソースに問い合わせます。 私が持っている問題は、式の2つの呼び出し(または悪い語彙のために残念な評価)が比較で一致することはないということです。結果として、NHibernateは同じパラメタで同じSQLをあまり頻繁に実行しません。NHibernateのキャッシュ:分かりやすい使用法、ベストプラクティス?

私は流暢にそうように構成され、NHibernateのキャッシュを使用してこの問題を中心に出荷さ:

Fluently.Configure().Database(MsSqlConfiguration.MsSql2008 
        .ConnectionString(c => c.Is(cStr)) 
        .ShowSql()) 
        .Mappings(x => x.FluentMappings.AddFromAssemblyOf<MyClassMap>()) 
        .Cache(x=>x.UseQueryCache() 
           .ProviderClass("NHibernate.Cache.HashtableCacheProvider")) 

これは生産で終わるしないように、私は、後でプロバイダの世話をします。 次は、私のすべてのクエリがキャッシュ可能であるとして示されている:

session.Query<MyClass>().Cacheable().Where(filter).ToList(); 

は、私の知る限りreadを持っているように、キャッシングクエリは1当たりのSessionFactoryスコープを有する第2のレベルのキャッシュ、で行われます。一方で、アプリケーションデータをリロードするためには、SessionFactoryを再インスタンス化しなければならないということです。これは、セッションで同じことをするよりはるかにコストがかかると思います。

SessionFactoryを使用してクエリをキャッシュする効率的な方法です(文字通り、意味することはありません)。

答えて

0

SessionFactoryを再作成せずに2番目のレベルキャッシュ(http://stackoverflow.com/questions/2660714/how-to-clear-the-entire-second-level-cache-in-nhibernate)をクリアすることはできますが、私は午前提供されたコードがキャッシュされたクエリをクリアするかどうかはわかりません。また、APIを使用して特定のプロバイダをクリアする方法もあります。しかし、あなたが手作業でキャッシュをクリアする必要があることはわかっているので、データベース内のデータを手動で変更する場合のみ(NHibernateではなく)。 NHで何かを変更すると、キャッシュ自体が更新されます。しかし、クエリされたデータをキャッシュよりも頻繁に変更すると、更新が頻繁に行われるため、キャッシュには役立ちません。

+0

リンクありがとうございます。手動ではなく、手動ではなく、最終的には同じ結果が得られます。データは、異なるコンピュータから会社全体で編集され、それぞれ独自のSessionFactoriesとセッションがあります。キャッシュをクリアしないと、 –

+1

@SebastianEdelmeierは分散キャッシュを使用します –

+0

@DiegoMijelshonはNCacheのような別の製品を指していますか? –

関連する問題