2011-01-17 4 views
4

나는 (특히 게으른 로딩을 사용할 때) 최대 절전 모드에서 몇 가지 문제가 발생한다고 여러 번 들었습니다. 가장 공통적 인 것은 무엇이며 그들에 대해 할 수있는 일은 무엇입니까?최대 절전 모드 지연로드를 사용할 때 주요 문제점은 무엇입니까?

+3

너무 모호합니다. 특정 문제가 있습니까? – skaffman

+1

내 응용 프로그램에서 지연로드를 사용하거나 사용하지 않는 문제. : D 나는 내가 겪어야 할 일을 알고 싶다. –

답변

9

가장 일반적인 것은 n+1 select problem입니다. 컬렉션을 지연로드하면 단일 조인 쿼리가 아닌 n + 1 개의 별도 쿼리가 발생합니다.

이러한 문제에 대한 해독제는 상식입니다. 나는 all relevant sources (우선적으로 Hibernate reference)이 해결 방법 및 해결 방법과 함께이 (및 기타 관련) 문제를 광범위하게 논의한다고 생각합니다. 간단히 말해, 조리법에서 맹목적으로 조리법을 복사해서는 안됩니다. 코드의 성능을 측정하고 적절하게 조정하십시오. 발행 된 선택 항목이 너무 많으면 특정 속성/클래스/쿼리에 대한 지연로드에서 조인 또는 하위 선택 가져 오기 전략으로 선택적으로 전환 할 수 있습니다. (이 두 가지 모두 자체적 인 단점이 있으므로 성능 측정이 중요합니다.)

클라이언트 코드가 엔티티/속성의 실제 유형에 따라 달라지는 경우 다른 문제가 발생합니다. instanceof으로 테스트 해 봅니다. 프록시 객체를 나타내는 프록시 객체를 발견하면 이러한 코드가 중단됩니다. 그러나이 코드는 어쨌든 작성하는 것이 가장 좋은 방법은 아니며, 거의 필요하지 않습니다. 그러나 때로는 레거시 코드로 상속되므로 해결하기가 어려울 수있는 충돌이 발생합니다.

+0

setLazy (false); –

+0

좋아요! 사물의 예는 제가 처음에는 불확실한 것이 었습니다. 고맙습니다. –

+0

분리 객체의 속성을 처음 요청할 때 나타나는 지연로드 예외도 있습니다. 어느 것이 중요합니다! –

0

로드 할 내용을 의도적으로 지정하는 데 HQL 가져 오기 전략을 사용할 수 있습니다 (예 : Hibernate Reference) :

from Cat as cat inner join fetch cat.mate left join fetch cat.kittens

불행하게도, Hibernate는 프로젝트 요구 사항에 따라 HQL의 일환으로 SQL의 모든 표준 선택 기능을 지원하지 않습니다, 금지 될 수 있습니다. 예를 들어 select from is select는 선택할 수 없지만 보고서를 작성하거나 데이터 분석을 수행하는 데 자주 필요합니다.

이것은 Hibernate의 SQL 실행 기능으로 극복 할 수 있습니다. 그러나이 접근법은 HQL의 객체 지향적 인 장점을 제공하지 않습니다 (예 : 모든 조인은 수동으로 만들어야합니다).

1

우선 EAGER fetching is a much bigger problem. 게으른 페칭은 필요한만큼의 정보를 가져올 수 있기 때문에 갈 길입니다.

Session이 열려있는 동안 지연 연결을 초기화하지 않고 지속성 컨텍스트를 닫은 후에 초기화되지 않은 Proxy/Collection을 탐색하려고하면 유일한 문제는 LazyInitializationException입니다.

N + 1 쿼리 문제는 eager (모든 eager 연관을 명시 적으로 가져 오지 않는 JPQL 쿼리를 실행할 때)와 지연 연결에 대해 발생할 수 있으며 솔루션은 LazyInitializationException과 동일합니다.

그러나 테스트 중에 모든 N + 1 쿼리 문제를 자동으로 감지 할 수 있습니다. 이 datasource-proxy based utility for more details on this topic을 확인하십시오.