문제

nhibernate profiler에서 나는 협회에서 열망하는 페치를 사용할 때, HQL 쿼리 또는 .setfetchmode ()에 "왼쪽 결합 페치"를 사용하여 쿼리가 쿼리 캐시에 더 이상 캐시되지 않는다는 것을 관찰했습니다.

실제로 내가 볼 수있는 것에서 매우 기본적인 쿼리 만 캐시됩니다. 누구든지 나에게 어떤 쿼리가 캐시되고 어떤 쿼리가 대답하지 않을지에 대한 통찰력을 줄 수 있다면 대답을 표시하지 않습니다.

차이가 있다면 MemCached를 사용하고 있습니다 .... 쿼리 밀도 시스템의 L2 캐시에 더 좋은 선택이 있습니까?

나는 이것을 다소 도전적으로 생각하고 있습니다. 열망하는 부하를 사용하지 않으면 N+1 문제가 있지만 캐시를 사용합니다. 열렬한 부하를 사용하면 데이터베이스에서 모든 엔티티를 얻지 만 캐싱은 없습니다.

두꺼운 분할 라인이있는 것 같습니다. 두 전략 모두 성능이 향상되었지만 두 전략 모두 다른 전략의 성능을 강요합니다.

이 '두꺼운 선'의 위치에 대한 통찰력을 줄 수 있다면 최적의 성능을 가져야하거나 '라인을 더 얇게 만드는 방법'을 가져야합니다 ... 나는 매우 게이트가 많고 답을 표시 할 것입니다.

도움이 되었습니까?

해결책

업데이트: 내 관련 질문을 참조하십시오 여기. 결론은 이미 2 레벨 캐시에있는 객체와 결합하지 않도록 fetch = "select"를 사용해보십시오.


나의 이전 대답 (여전히 유용 할 수 있음)

쿼리 캐시는 실제 개체가 아닌 쿼리에서 반환 된 식별자를 캐시합니다.

제대로 사용하려면해야합니다

  1. 장소 홀더 사용 (? 또는 : varname)
  2. 쿼리 캐시를 true로 설정하십시오 (당신은 did)
  3. 쿼리는 속성이 아닌 개체를 반환해야합니다 (from Foo, 아니다 select foo.bar from Foo foo)
  4. 반환 된 객체는 2 단계 캐시에 있거나 후속 호출은 동일한 최대 절전 모드 세션 (동일한 거래)에 있어야합니다.

#4를 명확히하기 위해, 2 개의 다른 트랜잭션이 정확한 매개 변수로 정확한 (캐시 된) 쿼리를 실행하고 정확히 동일한 객체를 반환하지만 두 번째 레벨 캐시에 있지 않으면 실제 객체를 얻기 위해 데이터베이스 히트가 여전히 발생합니다 (아마 A Select .. in)

쿼리 캐시는 두 가지에 유용합니다. 캐시되지 않은 항목에 대한 HQL 쿼리에 대해 동일한 트랜잭션에서 데이터베이스를 치지 말고 HQL 쿼리에 2 레벨 캐시 된 객체를 활용할 수 있습니다 (로드 또는 GET 명령에 자동으로 사용).

숲을 정리하기를 바랍니다 ...

다른 팁

나는 nhibernate에 대해 잘 모르지만 최대 절전 모드에서는 쿼리 사용 힌트를 위해 쿼리 캐싱을 명시 적으로 활성화해야합니다. L2 캐시는 개별 객체를 자동으로 캐시 할 수 있지만 쿼리에는 명시적인 방향이 필요합니다.

실제로 답이 아닙니다. 오히려 힌트 ... 컬렉션과 쿼리 캐시는 실제로 결과를 저장하지 않습니다. 결과 엔터티의 식별자를 저장합니다. 엔티티의 데이터를 저장하는 엔티티 / 클래스 캐시입니다.

따라서 그것에 대해 생각하십시오 - 쿼리가 여러 엔티티 유형 (예 : 열성적인 부하)을 반환하면 엔티티 간의 관계가 있기 때문에 ID 배열을 합리적으로 저장할 수 없습니다. 캐시 자체가 매우 간단한 구조라고 생각합니다.

나는 'value'쿼리에 대해 잘 모르겠습니다. 즉, 클래스 대신 투영을 사용하는 것입니다. 나는 당신이 이것들을 캐시 할 수 없다고 말할 것입니다. 그러나 나는 틀렸을 수도 있습니다.

이제 문제에 도움이되지는 않지만 다른 기술이 있습니다. 즉 배치로드 및 적절한 엔티티 캐시. 수집 캐시에주의를 기울일 것입니다. 나는 그들에게 여러 번 물었다.

그것이 도움이되기를 바랍니다 (적어도 조금).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top