NHibernate
에서 Load
또는 Get
방법을 사용하면 1 차 수준 캐시를 쉽게 활용할 수 있습니다. 그러나 ICriteria
, HQL
, Linq-to-NHibernate
및 QueryOver
은 어떨까요? 그들은 첫 번째 수준의 캐시도 사용합니까?1 차 수준 캐시를 ICriteria 또는 다른 API와 함께 사용할 수 있습니까?
4
A
답변
5
엔티티를 반환하는 데 사용하지만 두 번째 수준 캐시를 사용하지 않으면 쿼리가 곧바로 db로 이동합니다.
이를 고려
var fooUsingGet = session.Get<Foo>(fooId);
var fooQueryById = session.Query<Foo>().Single(f => f.Id == fooId);
두 쿼리가 실행됩니다 (대한 하나, 쿼리에 대한 하나를 얻을),하지만 두 변수가 같은 개체 참조가 포함되어 있습니다.
이제 2 레벨 캐시, 쿼리 캐싱을 활성화하고 쿼리 캐싱을 지정하는 경우 :
var fooQueryById = session.Query<Foo>().Cacheable()
.Single(f => f.Id == fooId);
var fooQueryByIdAgain = session.Query<Foo>().Cacheable()
.Single(f => f.Id == fooId);
하나 개의 쿼리가 실행됩니다.
0
아니요, 이해합니다. 두 번째 레벨 캐시 만 사용합니다. 전나무 레벨 캐시는 Get
및 Load
에만 해당됩니다.
향후 사용자를위한 메모 : 첫 번째 코드 블록에서는 (쿼리가 이어지는 경우) 두 개의 쿼리가 실제로 실행됩니다. 그러나 순서를 변경하고 (쿼리에 get이 뒤따라야 함) 첫 번째 캐시가 실행되기 때문에 하나만 보게됩니다. 쿼리가 캐시를 소중히합니다. 이것은 ayendes "Get, Load, Id by query"기사에 반하는 내용이지만 linq 드라이버의 이전 버전을 참조하는 것으로 보입니다. –