복붙노트

[SPRING] Spring의 OpenEntityManagerInViewFilter를 사용하지 않는 이유

SPRING

Spring의 OpenEntityManagerInViewFilter를 사용하지 않는 이유

많은 게시물이 Spring의 OpenSession / EntityManagerInViewFilter라는 주제로 작성되었지만, 그 결함에 대해서는 언급하지 못했습니다. 필자가 이해하고, @Transactional 서비스 레이어를 사용하는 일반적인 계층화 된 웹 응용 프로그램 아키텍처를 가정 할 때 필터는 다음과 같이 작동합니다.

8 단계와 9 단계에서 스레드의 EntityManager에 의해로드 된 객체는 여전히 관리됩니다. 결과적으로이 단계에서 지연 연결을 건 드리면 여전히 열려있는 EntityManager를 사용하여 데이터베이스에서로드됩니다. 내가 이해하는 바에 따르면, 이러한 각각의 액세스에는 데이터베이스가 트랜잭션을 열어야합니다. Spring의 트랜잭션 관리는 이것을 인식하지 못하기 때문에 내 "암시 적 트랜잭션"이라고 부릅니다.

이 문제는 2 가지가 있습니다.

한편으로는이 두 가지 이슈가이 필터를 사용하는 것을 거부하는 것으로 보입니다 (성능 저하, 데이터 불일치). 반면에이 솔루션은 매우 편리하고 여러 줄의 코드를 작성하지 않으며 문제 1은 그다지 눈에 띄지 않을 수 있으며 문제 2는 순수한 편집증 일 수 있습니다.

어떻게 생각해?

감사!

해결법

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

    1.앞에서 말했듯이 OpenSessionInView 필터는 웹 응용 프로그램에서 매우 편리합니다. 언급 한 제한 사항에 관해서 :

    앞에서 말했듯이 OpenSessionInView 필터는 웹 응용 프로그램에서 매우 편리합니다. 언급 한 제한 사항에 관해서 :

    예, DB로 이동하면 성능 문제가 발생할 수 있습니다. 하나의 여행에서 필요한 모든 데이터를 가져오고 싶을 것입니다. 이것을 위해 Hibernate join-fetch를 사용해보십시오. 그러나 DB에서 너무 많은 데이터를 가져 오는 것은 느려질 것입니다. 내가 사용하는 엄지 법칙은 뷰를 칠할 때마다 데이터가 필요할 경우 조인 페칭을 사용하는 것입니다. 대부분의 경우에 데이터가 필요하지 않다면, 나는 그것을 필요로 할 때 Hibernate가 게으른 fetch를하도록한다 - threadlocal open session이 도움이된다.

    이 애플리케이션을 JDBC로 작성한다고 상상해 보라 - 애플리케이션의 일관성 요구 사항에 따라 루트와 리프가 모두 동일한 txn에로드되어야한다고 요구되는 경우 조인 페칭을 사용한다. 그렇지 않은 경우, 종종 그렇습니다. 게으른 페칭은 일관성 문제를 일으키지 않습니다.

    IMHO, OpenSessionInView에서 더 중요한 단점은 웹 이외의 컨텍스트에서 서비스 계층을 다시 사용하려는 경우입니다. 당신의 설명에서, 당신은 그 문제가없는 것 같습니다.

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

    2.OpenSessionInView와 지연로드에 대해 들었던 주요 논쟁은 트랜잭션의 초과와 성능에 부정적인 영향입니다. 낮은 사용 요구 사항이있는 앱에서 사용하는 것이 매우 편리하지만 대규모 앱의 경우 완전히 구식 인 DTO (데이터 전송 객체)를 사용하는 것이 좋습니다.

    OpenSessionInView와 지연로드에 대해 들었던 주요 논쟁은 트랜잭션의 초과와 성능에 부정적인 영향입니다. 낮은 사용 요구 사항이있는 앱에서 사용하는 것이 매우 편리하지만 대규모 앱의 경우 완전히 구식 인 DTO (데이터 전송 객체)를 사용하는 것이 좋습니다.

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

    3.내가 OpenSessionInViewFilter를 접하게 될 주요한 문제점 중 하나는 AJAX 어플리케이션과 자바 스크립트를 사용하고 있다는 것입니다. 그리드 또는 특정 UI 구성 요소를 렌더링하기 위해 자바 스크립트를 사용하는 경우; 게으른로드가 있습니다 (필터를 켜는 것을 고려하십시오). 예외가 Throw됩니다. 응용 프로그램 UI 렌더링은 토스로 진행됩니다. 데이터가 표시되지 않을 수도 있습니다. 페이지가 이상한 자바 스크립트 예외를 던지기 시작합니다. 예외 처리를 위해 추가 js 코드를 작성해야합니다. 그리고 DB 예외를 사용자에게 노출시키고 있습니다 (좋은 생각은 아닙니다).

    내가 OpenSessionInViewFilter를 접하게 될 주요한 문제점 중 하나는 AJAX 어플리케이션과 자바 스크립트를 사용하고 있다는 것입니다. 그리드 또는 특정 UI 구성 요소를 렌더링하기 위해 자바 스크립트를 사용하는 경우; 게으른로드가 있습니다 (필터를 켜는 것을 고려하십시오). 예외가 Throw됩니다. 응용 프로그램 UI 렌더링은 토스로 진행됩니다. 데이터가 표시되지 않을 수도 있습니다. 페이지가 이상한 자바 스크립트 예외를 던지기 시작합니다. 예외 처리를 위해 추가 js 코드를 작성해야합니다. 그리고 DB 예외를 사용자에게 노출시키고 있습니다 (좋은 생각은 아닙니다).

    일반 응용 프로그램에서는 이러한 예외를 캡처 할 수 있으며 유효한 사용자 예외가 발생할 수 있습니다.

  4. ==============================

    4.응용 프로그램이 다중 계층 구조 (다른 JVM에 배치 된보기 계층과 서비스 계층이 다른 VM에 배포 됨) 인 경우 세션을 열린 상태로 유지하는 것이 의미가 없습니다. 귀하의 서비스 계층이 당신에게 독립적 인 애플리케이션 레이어라면 OpenSessionViewFilter를 사용하지 않을 것입니다.

    응용 프로그램이 다중 계층 구조 (다른 JVM에 배치 된보기 계층과 서비스 계층이 다른 VM에 배포 됨) 인 경우 세션을 열린 상태로 유지하는 것이 의미가 없습니다. 귀하의 서비스 계층이 당신에게 독립적 인 애플리케이션 레이어라면 OpenSessionViewFilter를 사용하지 않을 것입니다.

  5. from https://stackoverflow.com/questions/1538222/why-not-to-use-springs-openentitymanagerinviewfilter by cc-by-sa and MIT license