>Java >java지도 시간 >Hibernate의 OSIV(Open Session in View)는 나쁜 습관이며 대안은 무엇입니까?

Hibernate의 OSIV(Open Session in View)는 나쁜 습관이며 대안은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-24 07:21:13385검색

Is Open Session in View (OSIV) in Hibernate a Bad Practice and What are the Alternatives?

Hibernate에서 Open Session in View가 나쁜 습관인 이유

Open Session in View(OSIV)는 Hibernate에서 다음을 포함하는 패턴입니다. HTTP 요청 전반에 걸쳐 세션이 열립니다. 이는 LazyLoadException을 방지하는 데 도움이 될 수 있지만 다음과 같은 수많은 단점이 있습니다.

데이터베이스 관점 문제:

  • 자동 커밋 모드: 트랜잭션은 서비스 계층에 의해 커밋되지만 OSIV에서는 명시적으로 커밋되지 않으므로 UI ​​렌더링의 후속 데이터베이스 문은 자동 커밋으로 실행됩니다. 모드. 이는 빈번한 트랜잭션 로그 플러시를 요구하여 데이터베이스 서버에 부담을 줍니다.
  • 혼합된 명령문 소스: OSIV에서는 서비스 계층과 UI 렌더링 프로세스 모두에서 명령문을 생성할 수 있으므로 테스트가 어렵습니다. 여러 계층에 걸쳐 데이터베이스 상호 작용.

코드 복잡성 및 확장성 문제:

  • 제한된 UI 기능: OSIV는 UI 계층을 탐색 연결로 제한하여 잠재적으로 N 1 쿼리 문제를 유발할 수 있습니다.
  • 연결 보유: OSIV는 UI 렌더링 전반에 걸쳐 데이터베이스 연결을 보유하여 연결 임대 시간을 늘리고 트랜잭션을 줄일 수 있습니다.

Spring Boot 고려 사항:

Spring Boot에서는 OSIV가 기본적으로 활성화되어 있습니다. 애플리케이션 구성에서 spring.jpa.open-in-view=false를 설정하여 비활성화하는 것이 좋습니다.

LazyLoadException을 피하기 위한 대체 전략:

대신 OSIV의 경우 다음을 고려하십시오.

  • 열심히 가져오기 관계: 뷰 계층에 필요한 연관을 즉시 가져와서 엔터티가 검색될 때 로드되도록 합니다.
  • 서비스 계층에서 명시적 가져오기: fetch()와 같은 메서드를 사용하여 뷰를 렌더링하기 전에 명시적으로 연관을 가져옵니다.
  • 프로젝션: 프로젝션을 사용하여 불필요한 지연 초기화를 피하면서 뷰 레이어에 필요한 데이터만 검색합니다.
  • Criteria API: Criteria API를 활용하여 쿼리 및 즉시 가져오기 연결을 사용자 정의합니다.
  • 엔티티 그래프: 특정 용도에 따라 연관 검색을 최적화하도록 엔터티 그래프를 정의합니다. 경우입니다.

위 내용은 Hibernate의 OSIV(Open Session in View)는 나쁜 습관이며 대안은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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