В NHibernate
вы можете легко извлечь выгоду из кеша первого уровня при использовании методов Load
или Get
. Но как насчет ICriteria
, HQL
, Linq-to-NHibernate
и QueryOver
? Они также используют кеш первого уровня?Может ли кеш первого уровня использоваться с ICriteria или другими API-интерфейсами?
4
A
ответ
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);
только один запрос будет выполнен.
0
Нет, как я понимаю, они этого не делают. Они используют только кеш второго уровня. Кэш уровня Firs предназначен только для Get
и Load
.
Просто заметка для будущих людей: в вашем первом блоке кода (за ним следует запрос) два запроса действительно выполняются. Однако измените порядок (запрос, за которым следует get), и вы увидите только ОДИН - из-за того, что кеш первого уровня запускается - запрос представляет собой кеш. Это противоречит статье ayendes «Get, Load, query by Id», но это похоже на более раннюю версию драйвера linq –