봉 블로그

Hibernate 2차 캐시 본문

java

Hibernate 2차 캐시

idkbj 2017. 11. 25. 22:44

Hibernate 는 기본적으로 1차 캐시를 사용한다.

1차캐시는 트랜젝션 레벨 캐시이다. 하나의 트랜젝션에서 같은 entity 조회에 대한 중복 sql 호출을 방지해준다.


2차 캐시는 트랜젝션간 공유 캐시를 지원한다. 



캐시의 동시성 전략

트랜젝션간 캐시를 공유하기 위해서는 동시성 문제를 고려해야 한다.



READ_ONLY

변경되지 않는 엔티티에만 사용됩니다 (그러한 엔티티를 갱신하려고하면 예외가 Throw됩니다). 그것은 매우 간단하고 실행 가능합니다. 변경되지 않는 정적 참조 데이터에 매우 적합합니다.


NONESTRICT_READ_WRITE

영향을받은 데이터를 변경 한 트랜잭션이 커밋 된 후에 캐시가 업데이트됩니다. 따라서 강력한 일관성이 보장되지 않으며 오래된 데이터가 캐시에서 얻을 수있는 작은 시간 창이 있습니다. 이러한 종류의 전략은 최종 일관성을 허용 할 수있는 사용 사례에 적합합니다.


READ_WRITE

이 전략은 '소프트'잠금을 사용하여 강력한 일관성을 보장합니다. 캐시 된 엔티티가 업데이트되면 해당 엔티티의 캐시에도 소프트 잠금이 저장되며 트랜잭션이 커밋 된 후에 해제됩니다. 소프트 록 된 항목에 액세스하는 모든 동시 트랜잭션은 데이터베이스에서 직접 해당 데이터를 가져옵니다


TRANSACTIONAL

캐시 변경은 분산 XA 트랜잭션에서 수행됩니다. 캐시 된 엔터티의 변경 내용은 동일한 XA 트랜잭션의 데이터베이스와 캐시에서 모두 커밋되거나 롤백됩니다.



고려사항

1차 캐시 및 2차 캐시는 모두 entity의 id 를 key 로 캐시한다.

따라서 id 를 key 로 해서 selelct 해야 효과가 있다. (다른 방법이 있나??)

전통적인 service layer 의 cache 솔루션(Ehcache, Redis 등등)을 사용하는 편이 더 낫지 않을까??