NHibernate Caches: разумное использование, лучшие практики? - PullRequest
1 голос
/ 29 марта 2012

Я запрашиваю свои источники данных 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?

1 Ответ

0 голосов
/ 30 марта 2012

Вы можете очистить кэш второго уровня (/1960917/kak-ochistit-ves-kesh-vtorogo-urovnya-v-nhibernate), не воссоздавая SessionFactory, но я не уверен, что при условии, что код очищает также и кэшированные запросы. А также есть методы для очистки определенных поставщиков с их API. Но, как я знаю, вы должны очищать кэш вручную только в том случае, если вы вручную изменяете данные в db (не с помощью NHibernate). Если вы изменяете что-то с помощью NH, это обновляет сам кеш, но если вы меняете запрашиваемые данные очень часто, кеш вам не поможет, потому что это должно быть обновляется слишком часто.

...