문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 마지막 판 양쪽 다음 판 | ||
java:hibernate:cache [2014/06/29 23:59] kwon37xi [Cuncurrency Strategy] |
java:hibernate:cache [2018/08/22 09:09] kwon37xi |
||
---|---|---|---|
줄 6: | 줄 6: | ||
* Memcached임에도 Region(namespace) 지원 | * Memcached임에도 Region(namespace) 지원 | ||
* [[https:// | * [[https:// | ||
+ | |||
+ | ===== Hibernate의 기본 캐시 전략 ===== | ||
+ | * Memcached 등의 외부 서버보다는 로컬 JVM에서 값을 즉시 읽을 수 있는 [[java: | ||
+ | * [[http:// | ||
+ | * 기본적으로 Replication-Invalidation 전략을 사용한다. | ||
+ | * [[java: | ||
+ | * Entity와 컬렉션은 '' | ||
+ | * '' | ||
+ | * '' | ||
===== Cuncurrency Strategy ===== | ===== Cuncurrency Strategy ===== | ||
줄 11: | 줄 20: | ||
기본적으로 '' | 기본적으로 '' | ||
+ | |||
+ | **테스트시에 쿼리 삭제, 수정 등을 하고서 flush후에 rollback 하면 어떻게 되는지 테스트** | ||
==== READ_ONLY ==== | ==== READ_ONLY ==== | ||
읽기 전용. 우편 번호처럼 잘 안 변하는 것들에 적합할 듯. Read Only의 의미가 수정만 못하게 하는 것인지 수정과 삭제를 둘 다 못하게 하는 것인지에 대해서는 확실치 않다. 그래서 삭제는 가능한 것으로 가정하고 스토리를 짜면 아래 방식으로 했을 때 잘 작동한다. | 읽기 전용. 우편 번호처럼 잘 안 변하는 것들에 적합할 듯. Read Only의 의미가 수정만 못하게 하는 것인지 수정과 삭제를 둘 다 못하게 하는 것인지에 대해서는 확실치 않다. 그래서 삭제는 가능한 것으로 가정하고 스토리를 짜면 아래 방식으로 했을 때 잘 작동한다. | ||
줄 19: | 줄 30: | ||
* '' | * '' | ||
* 최초 데이터 가져온 후 캐시 생성 | * 최초 데이터 가져온 후 캐시 생성 | ||
- | * '' | + | * '' |
* 입력 : '' | * 입력 : '' | ||
* 수정 - 예외를 발생시켜야 한다. | * 수정 - 예외를 발생시켜야 한다. | ||
줄 63: | 줄 74: | ||
* '' | * '' | ||
* 최초 데이터 가져온 후 캐시 생성 | * 최초 데이터 가져온 후 캐시 생성 | ||
- | * '' | + | * '' |
* 입력 | * 입력 | ||
* '' | * '' | ||
줄 138: | 줄 149: | ||
===== Entity Collection Cache ===== | ===== Entity Collection Cache ===== | ||
+ | ==== 기본 ==== | ||
+ | |||
엔티티의 컬렉션을 캐시하려면 해당 컬렉션에 '' | 엔티티의 컬렉션을 캐시하려면 해당 컬렉션에 '' | ||
<code java> | <code java> | ||
줄 147: | 줄 160: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | 양방향 관계의 경우 **명시적으로 Collection 쪽에 수정이 발생**해야만 캐시가 갱신된다. | ||
+ | |||
+ | ==== OneToOne not owning size ==== | ||
+ | * OneToOne 관계의 not owning side(mappedBy를 명시한 부모측)에는 캐시가 걸리지 않는 것으로 보인다.[[https:// | ||
줄 157: | 줄 175: | ||
TypedQuery< | TypedQuery< | ||
query.setParameter(" | query.setParameter(" | ||
- | |||
query.setHint(" | query.setHint(" | ||
+ | query.setHint(" | ||
query.setHint(" | query.setHint(" | ||
</ | </ | ||
줄 189: | 줄 207: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | ===== Evict All ===== | ||
+ | 현재 Hibernate는 모든 리젼(Region)을 '' | ||
+ | <code java> | ||
+ | org.hibernate.Cache cache = sessionFactory.getCache(); | ||
+ | cache.evictEntityRegions(); | ||
+ | cache.evictQueryRegions(); | ||
+ | cache.evictDefaultQueryRegion(); | ||
+ | cache.evictCollectionRegions(); | ||
+ | </ | ||
+ | |||
+ | ===== Cache 관련 Properties ===== | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ===== Query 실행 후 Entity Cache 갱신 문제 ===== | ||
+ | * PK 기반 쿼리는 Cache에서 (있으면) 값을 가져오고, | ||
+ | * 하지만 Query 실행시에는 (Query Cache 가 꺼져 있으면) 쿼리 결과 Entity들을 다시 Cache에 넣는 일을 한다('' | ||
+ | * '' | ||
+ | * 하지만 '' | ||
+ | * | ||
+ | |||
===== 참조문서 ===== | ===== 참조문서 ===== | ||
* [[http:// | * [[http:// | ||
줄 196: | 줄 237: | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// |