Я запрашиваю свои источники данных NHibernate, используя выражение Linq.
Проблема, с которой я столкнулся, заключается в том, что никакие два вызова (или оценки, извините за плохой словарный запас) выражения никогда не совпадают в сравнении. Как следствие, NHibernate слишком часто выполняет один и тот же SQL с одинаковыми параметрами.
Я обошел эту проблему, используя NHibernate Cache, свободно настроенный так:
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 , запросы кеширования происходят в кеше второго уровня, который имеет область действия по одному на SessionFactory. Это, с другой стороны, означает, что для перезагрузки данных моего приложения мне нужно будет восстановить SessionFactory, что, на мой взгляд, намного дороже, чем делать то же самое с сеансами.
Является ли эффективный способ кэширования запросов без путаницы (не буквально, понимаете, что я имею в виду) с SessionFactory?