Можно ли использовать кэш первого уровня с ICriteria или другими API? - PullRequest
4 голосов
/ 07 февраля 2011

В NHibernate вы можете легко извлечь выгоду из кэша первого уровня при использовании методов Load или GetНо как насчет ICriteria, HQL, Linq-to-NHibernate и QueryOver?Они тоже используют кэш первого уровня?

Ответы [ 2 ]

5 голосов
/ 07 февраля 2011

Они используют его для возврата сущностей, но запросы идут прямо в БД, если вы не используете кэш второго уровня.

Учтите это:

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);

Будет выполнен только один запрос.

0 голосов
/ 07 февраля 2011

Нет, насколько я понимаю, они этого не делают. Они используют только кэш второго уровня. Первый уровень кэша только для Get и Load.

...