Grails/Gorm Default Fetch 전략 : FetchMode를 "Eager"로 설정하는시기? (열성 대 게으른)

StackOverflow https://stackoverflow.com/questions/654704

  •  19-08-2019
  •  | 
  •  

문제

도메인 클래스에서 FetchMode를 "Eager"로 설정할시기에 대한 일반적인 지침은 무엇입니까? FetchMode의 장단점 "Eager"대 기본 "Lazy"?

"eager"(fetchmode = eger)를 사용하는시기를 보여주는 몇 가지 구체적인 예/사용 사례를 포함 시키십시오 (FetchMode = Lazy).

도움이 되었습니까?

해결책

기본적으로 게으른 하중은 열렬한 대안 (성능, 자원 사용)보다 더 많은 이점이 있습니다. 그것은 모든 관계에 대한 기본 성배 설정 (Grails 1.1 이후)이므로 특정 문제를 경험하지 않는 한 일반적으로 열망하는 페치를 위해 구성해서는 안됩니다. 와 같은:

  • 도메인 인스턴스 공유 다른 최대 절전 모드 세션 (예 : 도메인 클래스 인스턴스를 HTTP 세션 범위에 넣고 사용자와 같은 속성에 액세스 할 때)
  • 레이아웃/뷰에서 도메인 클래스 인스턴스에 액세스 할 때 LazyInitializationException 얻기
  • 확실한 경우, 인스턴스를 가져 오면 매번 특정 관계 속성에 액세스 할 수 있습니다. 인스턴스가 가져 오면 열망하는 페치를 위해이 관계를 구성하는 것이 합리적입니다.

열망하는 페치는 거대한 데이터베이스를 처리 할 때 상당히 위험 할 수 있습니다. 다음과 같은 도메인 클래스를 상상해보십시오.

// really bad example
class TreeNode {

   String name            

   TreeNode parent

   static hasMany = [ childNodes: TreeNode ]

   static mapping {     
      parent lazy: false
      childNodes lazy: false
   }

}

Treenode 인스턴스를 읽으면 데이터베이스에서 도메인 클래스의 다른 모든 인스턴스를 메모리로 자동으로 가져옵니다. 인스턴스가 충분하면 1 인스턴스 만 가져와서 응용 프로그램을 죽일 것입니다.

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