source

Spring Boot의 이 spring.jpa.open-in-view=true 속성은 무엇입니까?

factcode 2022. 8. 30. 22:08
반응형

Spring Boot의 이 spring.jpa.open-in-view=true 속성은 무엇입니까?

를 .spring.jpa.open-in-view=true성성을속

  • true
  • 이게 진짜 뭘 하는 거지?나는 그것에 대해 설명할 만한 좋은 점을 찾지 못했다.
  • 그때,,,,를 쓰게 되나요?SessionFactoryEntityManagerFactory한 경우 하면 사용 수 있습니까?EntityManagerFactory대??

감사합니다!

OSIV 안티패턴

OSIV(Open Session in View)는 비즈니스 계층이 View 계층에 필요한 모든 연결을 가져오는 최선의 방법을 결정하는 대신 지속성 컨텍스트를 강제로 열어 View 계층이 프록시 초기화를 트리거할 수 있도록 합니다(다음 그림 참조).

OSIV 안티패턴

  • OpenSessionInViewFilter라고 부르다openSession가 되는 ★★★★★★★★★★★★★★」SessionFactory 수 있습니다.Session.
  • Session는 에 바인드되어 있습니다.
  • OpenSessionInViewFilter라고 부르다doFilterjavax.servlet.FilterChain 및 됩니다.
  • 가 호출되어 HTTP 요구를 기본에 라우팅합니다.PostController.
  • PostController라고 부르다PostServicePost엔티티
  • PostService " " " 가 열립니다.HibernateTransactionManager 을 재사용하다Session에 의해 OpenSessionInViewFilter.
  • PostDAOPost★★★★★★★★★★★★★★★★★★.
  • PostService만, 「」는 「」입니다.Session외부로 열려 있기 때문에 닫히지 않습니다.
  • DispatcherServlet는 UI 렌더링을 시작하고, 그 결과 느린 연관성을 탐색하여 초기화를 트리거합니다.
  • OpenSessionInViewFilter 수 .Session이치노

언뜻 보기에는 그렇게 나쁘지 않은 것처럼 보일 수 있지만, 일단 데이터베이스 관점에서 보면 일련의 결함이 더욱 분명해지기 시작합니다.

서비스 계층은 데이터베이스 트랜잭션을 열고 닫지만 이후에는 명시적인 트랜잭션이 진행되지 않습니다.따라서 UI 렌더링 단계에서 발행된 추가 문은 모두 자동 커밋 모드로 실행됩니다.자동 커밋은 각 트랜잭션이 마지막에 커밋을 발행하기 때문에 데이터베이스 서버에 부담을 줍니다.이것에 의해, 트랜잭션로그가 디스크에 플러시 되는 일이 있습니다. 가지 는 '를 붙이는 것'입니다.Connection읽기 전용으로 지정하면 데이터베이스 서버가 트랜잭션 로그에 쓰지 않아도 됩니다.

문장은 서비스 계층과 UI 렌더링 프로세스 모두에서 생성되므로 더 이상 문제를 분리할 수 없습니다.생성되는 문의 수를 나타내는 통합 테스트를 작성하려면 응용 프로그램을 웹 컨테이너에 배치하면서 모든 계층(웹, 서비스, DAO)을 거쳐야 합니다.인메모리 데이터베이스(HSQLDB 등)와 경량 웹 서버(Jetty 등)를 사용하는 경우에도 이러한 통합 테스트는 레이어가 분리되어 백엔드 통합 테스트가 데이터베이스를 사용하는 경우보다 실행 속도가 느립니다.또한 프론트 엔드 통합 테스트에서는 서비스 레이어가 완전히 조롱당하고 있습니다.

UI 계층은 N+1 쿼리 문제를 트리거할 수 있는 탐색 연결로 제한됩니다.Hibernate는 어소시에이션을 일괄적으로 취득할 수 있는 기능을 제공하지만 이 시나리오에 대응하기 위해 주석은 기본 취득 계획에 영향을 미치기 때문에 모든 비즈니스 사용 사례에 적용됩니다.따라서 데이터 액세스 레이어 쿼리는 현재의 유스케이스 데이터 취득 요건에 맞추어 커스터마이즈할 수 있기 때문에 훨씬 적합합니다.

마지막으로 데이터베이스 연결은 UI 렌더링 단계에서 유지되므로 연결 리스 시간이 길어지고 데이터베이스 연결 풀의 폭주로 인해 전체 트랜잭션 처리량이 제한됩니다.연결이 보류될수록 다른 동시 요청은 풀에서 연결을 얻기 위해 더 많이 대기합니다.

스프링 부트 및 OSIV

안타깝게도 OSIV(Open Session in View)는 Spring Boot에서 기본적으로 활성화되어 있으며 성능과 확장성 측면에서 OSIV는 매우 좋지 않습니다.

그러니까, 그 안에application.properties설정 파일의 엔트리는 다음과 같습니다.

spring.jpa.open-in-view=false

그러면 OSIV가 비활성화되므로LazyInitializationException올바른 길입니다.

버전 2.0부터는 OSIV가 디폴트로 유효하게 되어 있는 경우에 Spring Boot에 의해서 경고가 발행되기 때문에, 이 문제가 실가동 시스템에 영향을 미치기 훨씬 전에 검출할 수 있습니다.

은 등록됩니다.OpenEntityManagerInViewInterceptor는, 다음의 주소를 등록합니다.EntityManager스레드에 , 을 얻을 수 .그러면, 같은 것을 얻을 수 있습니다.EntityManager웹 요청이 완료될 때까지 계속합니다.은 겨울잠과 이 없다.SessionFactorysyslog.

늦은 감이 있지만 끄기 vs. ON의 의미에 대해 더 자세히 알아보려다 이 기사가 봄-오픈-세션 뷰에서 유용하다는 것을 알게 되었습니다.

이게 도움이 됐으면 좋겠는데...

언급URL : https://stackoverflow.com/questions/30549489/what-is-this-spring-jpa-open-in-view-true-property-in-spring-boot

반응형