Можно ли использовать кэш первого уровня с ICriteria или другими API?
В NHibernate
вы можете легко извлечь выгоду из кэша первого уровня при использовании Load
или же Get
методы. Но что насчет ICriteria
, HQL
, Linq-to-NHibernate
а также QueryOver
? Они тоже используют кэш первого уровня?
2 ответа
Решение
Они используют его для возврата сущностей, но запросы идут прямо в базу данных, если вы не используете кеш второго уровня.
Учти это:
var fooUsingGet = session.Get<Foo>(fooId);
var fooQueryById = session.Query<Foo>().Single(f => f.Id == fooId);
Выполняются два запроса (один для Get, другой для Query), но обе переменные содержат одну и ту же ссылку на объект.
Теперь, если вы включите кэш 2-го уровня, кеширование запросов и укажите кеширование для запроса:
var fooQueryById = session.Query<Foo>().Cacheable()
.Single(f => f.Id == fooId);
var fooQueryByIdAgain = session.Query<Foo>().Cacheable()
.Single(f => f.Id == fooId);
Будет выполнен только один запрос.
Нет, насколько я понимаю, они этого не делают. Они используют только кэш второго уровня. Первый уровень кеша предназначен только для Get
а также Load
,