2012-03-29 4 views
1

Я запрашиваю у своих источников данных NHibernate, используя выражение Linq. Проблема, с которой я сталкиваюсь, состоит в том, что никакие два вызова (или оценки, извиняемые за плохой словарный запас) выражения, когда-либо совпадающего в сравнении. Как следствие, NHibernate слишком часто выполняет один и тот же SQL с теми же параметрами.NHibernate Caches: разумное использование, лучшие практики?

Я грузил вокруг этого вопроса, используя 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, кэширование запросов происходит в кэш-памяти второго уровня, который имеет один-в-SessionFactory сферу. Это, с другой стороны, означает, что для перезагрузки моих данных приложения мне пришлось бы восстановить SessionFactory, что, по моему мнению, намного дороже, чем то же самое с сеансами.

Является эффективным способом кэширования запросов без беспорядка (не буквально, знаешь, что я имею в виду) с SessionFactory?

ответ

0

Вы можете очистить кэш второго уровня (http://stackoverflow.com/questions/2660714/how-to-clear-the-entire-second-level-cache-in-nhibernate) без воссоздания SessionFactory, но я не уверен, что при условии, что код очищает также кешированные запросы. А также есть способы, чтобы очистить конкретных провайдеров с их api. Но поскольку я знаю, что вам нужно вручную очищать кеш, только если вы измените данные в db вручную (не с NHibernate). Если вы что-то измените с помощью NH, он будет обновлять кеш. Но если вы часто меняете запрашиваемые данные, а кеш вам не поможет, потому что их нужно будет обновлять слишком часто.

+0

Спасибо за ссылку. Ну, а не вручную, но в конечном итоге с тем же последствием: данные редактируются по всей компании с разных компьютеров, каждый из которых имеет свои собственные SessionFactories и сеансы ... Если бы я не очистил кеши, я бы работал с возможно устаревшими объектами –

+1

@SebastianEdelmeier использует распределенный кеш, затем –

+0

@DiegoMijelshon вы имеете в виду другой продукт, такой как NCache? –

Смежные вопросы