>Java >java지도 시간 >Hibernate Open Session in View: 사용할 것인가, 사용하지 않을 것인가?

Hibernate Open Session in View: 사용할 것인가, 사용하지 않을 것인가?

Linda Hamilton
Linda Hamilton원래의
2024-12-06 01:30:13727검색

Hibernate Open Session in View: To Use or Not to Use?

View의 Hibernate 공개 세션: 논란의 여지가 있는 관행

소개

View의 공개 세션 (OSIV)는 최대 절전 모드 세션을 열린 상태로 유지하는 최대 절전 모드 기능입니다. 요청-응답 주기 동안. 이 방식은 Java 커뮤니티에서 논쟁의 주제가 되었으며 일부는 편의성을 옹호하는 반면 다른 일부는 단점에 의문을 제기했습니다.

OSIV 관련 문제

OSIV는 몇 가지 과제를 제시합니다. :

  • 일관되지 않은 거래 처리: OSIV는 일반적인 트랜잭션 수명주기를 우회하여 세션이 무기한으로 열립니다. 이는 데이터 일관성 문제와 같은 의도하지 않은 결과로 이어질 수 있습니다.
  • 데이터베이스 성능 저하: 세션을 열어두면 응답 처리 중에 추가 명령문이 실행되므로 데이터베이스에 부담을 줍니다(예: , 지연 연관 초기화)는 자동 커밋 모드에서 실행됩니다.
  • 흐릿한 레이어 분리: OSIV는 비즈니스 계층과 UI 렌더링 단계 간의 관심 분리를 모호하게 만들어 애플리케이션 테스트 및 유지 관리를 어렵게 만듭니다.
  • 연결 임대 시간 증가: 세션 장기간 열어두어 데이터베이스 연결 풀의 수를 제한할 수 있습니다. 리소스.

대체 전략

이러한 문제를 방지하기 위해 개발자는 대체 전략을 사용할 수 있습니다.

  • 명시적으로 초기화 게으른 연관: Join Fetch를 사용하여 서비스 계층에서 게으른 연관을 초기화하거나 FetchMode.SUBSELECT.
  • 별도의 DAO 쿼리 생성: 필요한 연결만 가져오도록 맞춤화된 UI 레이어에 대한 특정 DAO 쿼리를 작성합니다.
  • 뷰 사용 프로젝션: 완료되지 않고 UI에 필요한 필수 필드만 반환하는 프로젝션을 만듭니다. 엔터티.
  • FetchMode.LAZY 및 EAGER 로드 사용: 즉시 필요하지 않은 엔터티에는 FetchMode.LAZY를 구성하고, 미리 로드해야 하는 연결에는 FetchMode.EAGER를 구성합니다.

봄에 OSIV 비활성화 Boot

Spring Boot는 기본적으로 OSIV를 활성화합니다. 이를 비활성화하려면 application.properties 파일에서 다음 속성을 설정하십시오.

spring.jpa.open-in-view=false

이 설정은 각 서비스 계층 트랜잭션 후에 Hibernate 세션이 닫히도록 보장하여 OSIV와 관련된 잠재적인 단점을 방지합니다.

위 내용은 Hibernate Open Session in View: 사용할 것인가, 사용하지 않을 것인가?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.