Я пробую кэш второго уровня в 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 запрашивает эти «недостающие» данные сущностей?