2011-02-07 4 views
4

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

ответ

5

Они используют его для возврата объектов, но запросы идут прямо к db, если вы не используете кеш второго уровня.

Рассмотрим это:

var fooUsingGet = session.Get<Foo>(fooId); 
var fooQueryById = session.Query<Foo>().Single(f => f.Id == fooId); 

Два запросы выполняются (один для Get, один для запроса), но обе переменные содержат один и тот же ссылку на объект.

Теперь, если вы включите кэш 2-го уровня, кэширование запросов, и указать кэширование для запроса:

var fooQueryById = session.Query<Foo>().Cacheable() 
          .Single(f => f.Id == fooId); 
var fooQueryByIdAgain = session.Query<Foo>().Cacheable() 
           .Single(f => f.Id == fooId); 

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

+1

Просто заметка для будущих людей: в вашем первом блоке кода (за ним следует запрос) два запроса действительно выполняются. Однако измените порядок (запрос, за которым следует get), и вы увидите только ОДИН - из-за того, что кеш первого уровня запускается - запрос представляет собой кеш. Это противоречит статье ayendes «Get, Load, query by Id», но это похоже на более раннюю версию драйвера linq –

0

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