Кэш запросов NHibernate делает один запрос на строку для выборки объектов - PullRequest
1 голос
/ 27 апреля 2011

Я пробую кэш второго уровня в NHibernate. С этим кодом:

return session.Query<Payment>()
    .Cacheable()
    .OrderByDescending(payment => payment.Created)
    .Skip((page - 1)*pageSize)
    .Take(pageSize).ToArray();

Если объекты не находятся в кэше, это приведет к выполнению таких запросов:

select ... from Payment where Id = 1
select ... from Payment where Id = 2
select ... from Payment where Id = 3

Если будет возвращено 100 строк, будет выполнено 100 из них. То есть большая проблема с производительностью. Было бы лучше, если бы только этот запрос был выполнен:

select ... from Payment where Id in (1,2,3)

То, что сущности не существуют в кеше, может быть связано с тем, что кеш сущностей не настроен, из-за ограниченного размера кешей или с тем, что сущности в кеше истекли или удалены из кеша.

Чтобы не заставлять полностью полагаться на кэш сущностей, можно ли изменить способ, которым NHibernate запрашивает эти «недостающие» данные сущностей?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

1) Можно ли настроить NHibernate (я использую FluentNHibernate с автоматическим сопоставлением), чтобы также кэшировать объекты?

Да, можно настроить кэш второго уровня Nhibernate для кеширования сущностей. См. Здесь

2) И чтобы не заставлять 100% полагаться на кэш, можно ли изменить способ, которым NHibernate запрашивает эти «отсутствующие» данные сущности?

Включили ли вы свойство cache.use_query_cache в файле конфигурации?

0 голосов
/ 27 апреля 2011

Необходимо указать ту же область кэша, чтобы «активировать» те же правила кэширования для коллекций, что и для основного объекта.В противном случае он будет только кэшировать основной объект и извлекать коллекцию снова, если основной объект был загружен из кэша 2-го уровня.

Я не знаю, поддерживается ли это с FluentNhibernate, тем не менее, вам нужно будет проверитьдокументы.

Похоже, что Collections (Bag) имеет поддержку .Cache (отображение CacheMapping)

http://fluentnhibernate.org/api/FluentNHibernate.MappingModel/CacheMapping.htm

...