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