Ага, понял!Как выяснилось, это была ошибка не всего кеша второго уровня, а скорее всего виновато использование нами QueryOver.
Поскольку мы пишем мультитенантное SaaS-приложение, большинство наших запросов выглядели так:
return
Session.QueryOver<Article>().Cacheable().
Where(a => a.Site == site && a.PublishedAt <= publishedAt).
OrderByCoalesceDesc(typeof(DateTime), a => a.UpdatedAt, a => a.CreatedAt).
Take(count).
Future();
И a.Site == site
была проблема.Очевидно, способ кеширования запросов проверяет, кэшируются ли результаты запроса или нет, в основном, используя комбинацию оператора SQL и всех параметров в качестве ключа к «хеш-таблице» кеша.Текст оператора SQL всегда одинаков для наших мультизапросов, но виновником был параметр site
.NH проверяет, соответствуют ли все предоставленные параметры тем, которые уже находятся в кэше, и, естественно, у нас Equals()
не реализовано в нашем классе Site
, поэтому проверка всегда заканчивалась неудачей.наши запросы, как это:
var siteID = site.ID;
return
Session.QueryOver<Article>().Cacheable().
Where(a => a.Site.ID == siteID && a.PublishedAt <= publishedAt)...