복붙노트

[SPRING] JPA / 큰 컬렉션을 최대 절전 모드로 전환

SPRING

JPA / 큰 컬렉션을 최대 절전 모드로 전환

두 가지 유형의 엔터티가있는 시나리오에서 부모 및 자식 :

부모의  @OneToMany 컬렉션 어린이들;

기본값은 자식 컬렉션에서 느린 로딩을 사용하는 것입니다. 이 모델은 소수의 어린이에게 효과적이지만, 숫자가 너무 커지면 지속될 수없는 것처럼 보입니다. 따라서 아이들의 수가 매우 많을 것이라고 생각하는 경우 페이징 (예 : "getChildren (부모 parent, int offset, int count)")과 같은 서비스 메소드를 사용했습니다.

질문 :이 같은 상황을 처리하는 가장 좋은 방법입니까? 또는 나는 무엇인가 놓쳤다?

감사, Piotr

해결법

  1. ==============================

    1.나는 그것이 당신이 그들과하고 싶은 것에 달려 있다고 말하고 싶지만, 대부분의 경우에, 이것은 사실입니다.

    나는 그것이 당신이 그들과하고 싶은 것에 달려 있다고 말하고 싶지만, 대부분의 경우에, 이것은 사실입니다.

    브라우징을 위해 (매우) 많은 수의 결과를 표시해야하는 경우 페이징은 매우 자연스러운 방법입니다. 인간은 대부분 모든 기록을 원하거나 필요로하지 않으며 어쨌든 엄청난 수의 결과를 처리 할 수 ​​없습니다. 한 번에 모든 결과를 처리해야하는 응용 프로그램의 경우는 물론 다르지만 JPA는 단순히 적합하지 않을 수 있습니다.

    IMO, parent.getChildren ()을 호출하여 얻을 수있는 전체 콜렉션을 결과 페이지에 제공하는 것보다 훨씬 낫습니다. 그러면 데이터베이스, 네트워크, 응용 프로그램 서버 자원을 절약 할 수 있습니다.

    고려해야 할 또 다른 사항은 검색을 수행 할 때 최대 결과 수를 제한하는 것입니다. 결과를 페이징하는 대신 (어쨌든 누구를 검색 할 것인가?), 사용자에게보다 제한적인 검색을 수행하는 것이 일반적이다. 즉 결과 수가 사람이 관리 할 수있게 될 때까지 검색 기준을 추가하는 것이 일반적이다. 이것은 초기 질문과는 조금 다릅니다.

  2. ==============================

    2.당신이하고있는 것처럼 (즉, 별도의 쿼리로 자식로드)하는 것이 아마도 최상의 솔루션 일 것입니다.

    당신이하고있는 것처럼 (즉, 별도의 쿼리로 자식로드)하는 것이 아마도 최상의 솔루션 일 것입니다.

    생각해야 할 다른 것 : Hibernate는 컬렉션을위한 "추가 게으른"로딩 옵션을 가지고 있습니다. 정규 게으르는 로딩을 사용하면 처음 컬렉션에 액세스 할 때 전체 컬렉션이로드됩니다. extra-lazy 모드에서 Hibernate는 필요에 따라 한 번에 몇 개의 요소를 콜렉션에로드 할 수있다. 나는 당신이 Hibernate API를 직접 사용하지 않는다면이 기능에 접근 할 방법이 없다고 생각한다. JPA는 "게으른"그리고 "열망하는"것에 대해서만 알고있다.

  3. ==============================

    3.모든 아이들이 필요합니까? 또는 반환 된 전체 목록에서 몇 가지를 선택 하시겠습니까? 그렇다면 원하는 항목을 하위 항목에 직접 쿼리하십시오. 모두 필요하다면 페이지 매김을 살펴보십시오.

    모든 아이들이 필요합니까? 또는 반환 된 전체 목록에서 몇 가지를 선택 하시겠습니까? 그렇다면 원하는 항목을 하위 항목에 직접 쿼리하십시오. 모두 필요하다면 페이지 매김을 살펴보십시오.

  4. from https://stackoverflow.com/questions/3783301/jpa-hibernate-big-collections by cc-by-sa and MIT license