복붙노트

[SPRING] Hibernate lazy-load 애플리케이션 디자인

SPRING

Hibernate lazy-load 애플리케이션 디자인

필자는 Spring 프레임 워크와 함께 Hibernate를 사용하는 경향이 있으며 선언적 트랜잭션 구분 기능 (예 : @Transactional)을 사용합니다.

우리 모두가 알 수 있듯이, 최대 절전 모드는 가능한 한 비 침입적이고 투명하게하려고 시도하지만, 이것은 게으른로드 관계를 사용할 때 좀 더 힘들다는 것을 증명합니다.

나는 다른 수준의 투명성을 지닌 수많은 디자인 대안을보고있다.

나는 어떤 선택을 놓쳤는가?

애플리케이션 설계에서 지연로드 관계의 영향을 최소화하려는 경우 선호하는 방법은 무엇입니까?

(오, 미안해)

해결법

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

    1.나는 초기 가정이 잘못되었다고 말할 것이다. 투명한 지속성은 애플리케이션이 항상 개체 라이프 사이클과로드되는 개체 그래프의 크기를 관리해야하므로 신화입니다.

    나는 초기 가정이 잘못되었다고 말할 것이다. 투명한 지속성은 애플리케이션이 항상 개체 라이프 사이클과로드되는 개체 그래프의 크기를 관리해야하므로 신화입니다.

    Hibernate는 생각을 읽을 수 없기 때문에 특정 연산에 대한 특정 의존성 세트가 필요하다면 어떻게 든 Hibernate에 대한 의도를 표현해야한다.

    이러한 관점에서 명시 적으로 이러한 의도를 표현하는 솔루션 (즉, 2, 4 및 7)은 합리적으로 보이고 투명성이 부족하지 않습니다.

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

    2.나는 당신이 암시하는 어떤 문제 (게으름으로 인한)를 모르겠다. 내게 가장 큰 고통은 내 애플리케이션 캐시에서 세션 컨텍스트를 잃지 않도록하는 것이다. 일반적인 경우 :

    나는 당신이 암시하는 어떤 문제 (게으름으로 인한)를 모르겠다. 내게 가장 큰 고통은 내 애플리케이션 캐시에서 세션 컨텍스트를 잃지 않도록하는 것이다. 일반적인 경우 :

    따라서이 문제를 해결하기 위해 다음과 같은 규칙이 있습니다.

    보시다시피 비 침습적이면서 투명한 곳은 없습니다. 그러나 열망하는로드에 대해 지불해야하는 가격과 비교하면 비용은 여전히 ​​견딜 수 있습니다. 후자에 대한 문제는 단일 참조 객체를로드 할 때 나비 효과가 발생한다는 것입니다. 단 하나의 엔티티 집합은 말할 것도 없습니다. 언급하는 메모리 소비, CPU 사용량 및 대기 시간도 훨씬 더 악화되어 있으므로 함께 살 수 있습니다.

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

    3.매우 일반적인 패턴은 웹 애플리케이션을 작성하는 경우 OpenEntityManagerInViewFilter를 사용하는 것입니다.

    매우 일반적인 패턴은 웹 애플리케이션을 작성하는 경우 OpenEntityManagerInViewFilter를 사용하는 것입니다.

    서비스를 만드는 경우 DAO 대신 공개 메서드에서 TX를 열어 볼 수 있습니다. 메서드에서 여러 엔터티를 가져 오거나 업데이트해야하는 경우가 자주 있습니다.

    이렇게하면 "Lazy Load 예외"가 해결됩니다. 성능 튜닝을 위해 좀 더 진보 된 것이 필요하다면, 패치 프로파일을 사용하는 것이 최선의 방법이라고 생각합니다.

  4. from https://stackoverflow.com/questions/5027013/hibernate-lazy-load-application-design by cc-by-sa and MIT license