1

Linq式を使用してNHibernateデータソースにクエリを実行します。私が抱えている問題は、式の2つの呼び出し(または評価、悪い語彙で申し訳ありません)が比較で一致しないことです。結果として、NHibernateは同じパラメーターを使用して同じSQLを頻繁に実行します。

私はこの問題を回避するために、次のように流暢に構成された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();

私が読んだ限りでは、キャッシュクエリはSessionFactoryごとに1つのスコープを持つ第2レベルのキャッシュで発生します。一方、アプリケーションデータをリロードするには、SessionFactoryを復元する必要があります。これは、セッションで同じことを行うよりもはるかにコストがかかると思います。

SessionFactoryを台無しにすることなく(文字通りではなく、私が何を意味するのかを知っている)クエリをキャッシュする効率的な方法はありますか?

4

1 に答える 1

0

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

于 2012-03-30T09:32:19.663 に答える