NHibernate кэширование второго уровня с несколькими запросами - PullRequest
3 голосов
/ 07 сентября 2011

Мы широко используем функцию множественных запросов NHibernate и испытываем странное поведение.Похоже, что NHibernate не кэширует мультизапросы, и они всегда попадают в базу данных.Мы используем QueryOver, все запросы настроены для кэширования, но при тестировании домашней страницы с шаблоном blitz.io с шаблоном -p 1-250:30 я вижу, что выполняется только один многопользовательский запрос, обращающийся к базе данных. 2000+ раз, тогда как другие запросы (например, выбор текущего вошедшего в систему пользователя) выполняются только один или два раза.

Итак, вопрос: я что-то упустил или NHibernate на самом деле не кеширует результаты нескольких запросов?

1 Ответ

4 голосов
/ 08 сентября 2011

Ага, понял!Как выяснилось, это была ошибка не всего кеша второго уровня, а скорее всего виновато использование нами 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)...
...