Свободный кеш первого уровня не работает должным образом
У меня есть функция, которая вызывается много раз за один сеанс. Насколько я понимаю, с кэш-памятью первого уровня NHibernate точный запрос в том же сеансе будет выполняться только один раз, независимо от количества вызовов.
Это не тот случай, хотя. Ниже приведен фрагмент кода, и я вижу, как запрос выполняется в NHProfiler столько раз, сколько вызывается функция.
public List<CustomerType> GetAllActiveCustomerTypes()
{
return _unitOfWork.CurrentSession.QueryOver<CustomerType>().Where(x => x.Active).List();
}
Я что-то упускаю в понимании NHibernate здесь?
Спасибо
1 ответ
Ваш опыт правильный. Запросы не кэшируются кешем первого уровня сеансов. Чтобы расширить понимание, прочтите это: Кэширование первого и второго уровня в NHibernate
Извлечение кеша первого уровня:
... Кэш первого уровня также называется картой идентификаторов и используется не только для уменьшения количества обращений к базе данных для повышения скорости работы приложения, но также для гарантии того, что не существует двух отдельных экземпляров объекта. имея тот же идентификатор...
а также
...При использовании NHibernate кэш первого уровня автоматически включается, если используется стандартный объект сеанса... Когда NHibernate загружает объект по его уникальному идентификатору из базы данных, он автоматически помещается в так называемую карту идентификации...
Как сказано, это служит для entity
цели кеширования.
Извлечение кэша второго уровня:
- ... может кэшировать отдельные объекты или целые агрегаты в кеше 2-го уровня.
- ... также может кэшировать (сложные и / или трудоемкие) запросы в кеше 2-го уровня.