OSIV(Open Session In View)
●헬스체크란?
●트랜잭션 방식의 OSIV의 문제는 어떻게 풀어볼 수 있을까?
1.클라이언트의 요청이 들어오면 서블릿 필터나 스프링 인터셉터에서 영속성 컨텍스트를 생성
2.응용 계층에서 @Transactional로 트랜잭션을 시작할 때 미리 생성한 영속성 컨텍스트를 찾아와서 트랜잭션을 시작
3.응용 계층이 끝나면 트랜잭션을 커밋하고 영속성 컨텍스트를 플러시 (영속성 컨텍스트는 종료하지 않음)
4.컨트롤러와 뷰까지 영속성 컨텍스트가 유지되므로 조회한 엔티티는 영속 상태를 유지할 수 있음
5.필터, 인터셉터로 요청이 돌아오면 영속성 컨텍스트를 종료하는데 이때 플러시는 수행하지 않음
●스프링 방식의 OSIV의 문제점
표현 계층에서 엔티티를 수정하면 데이터베이스에 반영하지 않습니다. 하지만, 엔티티를 수정한 이후 트랜잭션을 시작하는 응용 계층을 시작한 경우 문제가 발생하며, 응용 계층 트랜잭션이 끝나고 영속성 컨텍스트를 플러시하는 과정에서 변경 감지가 동작할 수 있음
OSIV 기능을 사용하면 상대적으로 오래 DB 커넥션을 점유하기 때문에 커넥션 고갈로 이어질 수 있음
●OSIV 기능을 비활성화하여 성능 최적화
●무조건 OSIV 기능을 비활성화해야 할까?
무조건 비활성화하기 보다는 꺼야하는 근거가 필요하며, 만약 트랜잭션 범위 밖에서 지연로딩을 반드시 수행해야하는 경우에는 비활성화하기 어려울 수도 있음
데이터베이스를 복제하여 사용하는 경우, 데이터소스도 분리해야하며, OSIV 기능으로 인해 예기치 않은 데이터베이스로 요청이 전달될 수 있으며, 대량의 트래픽이 발생하는 경우처럼 데이터베이스 커넥션을 효율적으로 사용해야할 수도 있으며, 위와 같은 경우에는 OSIV 비활성화를 고려해볼 수 있음
상황에 적합한 경우 OSIV 기능을 비활성화하는 것이 적절