-
#Spring Data JPA - 9 쿼리메소드 -JPA Hint & LockSpring 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 트랜잭션과 락 절을 참고
'Spring Data JPA' 카테고리의 다른 글
#Spring Data Jpa - 12 확장기능 - Web 확장 (0) 2021.03.25 #Spring Data JPA - 11 확장기능 - Auditing (0) 2021.03.25 #Spring Data JPA - 8 쿼리메소드 -@EntityGraph (0) 2021.03.24 #Spring Data JPA - 6 쿼리메소드 - 페이징과 정렬 (0) 2021.03.24 #Spring Data JPA - 5 쿼리메소드 - 반환타입 (0) 2021.03.23