ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #Spring Data JPA - 9 쿼리메소드 -JPA Hint & Lock
    Spring Data JPA 2021. 3. 24. 16:55

    JPA Hint & Lock

     

    JPA Hint (JPA의 구현체인 hibernate에게 알려주는 것)

    JPA 쿼리 힌트(SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트)

     

    데이터를 변경할 목적이아니고 화면에 뿌리고만 끝낼건데 findMById를 하는순간 DB에서 원본을 들고온다.

    100% 조회용으로 쓸거라고하면 JPA표준에서는 제공하지않고 hibernate에서는 제공한다.

     

    쿼리 힌트 사용

    @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value ="true"))
    Member findReadOnlyByUsername(String username);

    쿼리 힌트 사용 확인

    @Test
    public void queryHint() throws Exception {
         //given
         memberRepository.save(new Member("member1", 10));
         em.flush();
         em.clear();
         
         //when
         Member member = memberRepository.findReadOnlyByUsername("member1");
         member.setUsername("member2");
         em.flush(); //Update Query 실행X
     }

    읽을때부터 readonly true면 내부적으로 성능최적화를하여 snapshot을 안만들고 변경안된다고 감지하고 무시한다.

    -내부적으로 읽기만 쓰는구나 하고 인식

     

    쿼리 힌트 Page 추가 예제

    @QueryHints(value = { @QueryHint(name = "org.hibernate.readOnly"
                                                    ,value = "true")}
                                                    ,forCounting = true)
    Page<Member> findByUsername(String name, Pagable pageable);

    · corg.springframework.data.jpa.repository.QueryHints 어노테이션을 사용

    · forCounting : 반환 타입으로 Page 인터페이스를 적용하면 추가로 호출하는

      페이징을 위한 count 쿼리도 쿼리 힌트 적용(기본값 true )

     

    Lock

    
        //select for update -  db에 select할떄 다른애들 함부로 건들지마
        @Lock(LockModeType.PESSIMISTIC_WRITE) //Javax.persistent이기때문에 JPA꺼다 
        List<Member> findLockByUsername(String name);

    · org.springframework.data.jpa.repository.Lock 어노테이션을 사용

    · JPA가 제공하는 락은 JPA 책 16.1 트랜잭션과 락 절을 참고

     

     

    댓글

Designed by Tistory.