복붙노트

[SPRING] Spring / Hibernate에서의 적절한 캐시 사용법

SPRING

Spring / Hibernate에서의 적절한 캐시 사용법

프로젝트 X에는 다음과 같은 부분이 있습니다.

에이. 별도의 메소드가있는 Spring 데이터 저장소 :

@Cacheable(value = "xobjects", unless = "#result == null")
XObject findByParamA(String paramA);

@Cacheable(value = "xobjects", unless = "#result == null")
XObject findByParamB(String paramB);

@CacheEvict("xobjects")
<E extends XObject> E save(E entity);

비. 또한 "xobjects"캐시를 사용하는 Hibernate.

문제 # 1 캐시에 객체를 추가하는 두 가지 방법이 있으므로 같은 객체가 두 번 나타나는 상황이 될 수 있습니다. 어떻게이 문제를 해결할 수 있을까요? 예를 들어 결과 객체의 키를 사용합니다. 같은 것 :

문제 # 2 "save"메서드가 호출 될 때 캐시에서 모든 개체를 제거하고 싶지 않지만 현재 구현이 작동하는지 확신 할 수 없습니다. "save"메소드는 입력으로 xobject를 가지므로 CacheEvict는이를 그것을 퇴거의 열쇠로 사용할 것이고 예상 한 것은 아무것도 발생하지 않을 것입니다. 위와 같은 방식으로 마법 같은 키를 사용할 수 있다면 좋을 것 같습니다.

업데이트 # 1 사실 내 제안이 효과가 있다고 생각합니다. 여기 샘플이 있습니다. - https://github.com/zhangkaitao/spring4-showcase/blob/master/spring-cache/src/main/java/com/sishuok/spring/ service / UserService2.java 하지만 먼저 테스트해야합니다. 나중에 결과를 공유합니다.

해결법

  1. ==============================

    1.귀하의 접근 방식은 작동하지 않거나 유지 보수하기가 어려울 것입니다. 수동으로 캐시를 유지할 필요가있는 것 외에도, 자신의 캐시에서 리턴 한 엔티티가 항상 분리되므로 엔티티 인스턴스를 관리하려는 경우 엔티티 인스턴스를 각각의 새로운 Hibernate 세션 (지속성 컨텍스트)으로 다시 병합해야합니다.

    귀하의 접근 방식은 작동하지 않거나 유지 보수하기가 어려울 것입니다. 수동으로 캐시를 유지할 필요가있는 것 외에도, 자신의 캐시에서 리턴 한 엔티티가 항상 분리되므로 엔티티 인스턴스를 관리하려는 경우 엔티티 인스턴스를 각각의 새로운 Hibernate 세션 (지속성 컨텍스트)으로 다시 병합해야합니다.

    최선의 방법은 자동으로 캐시 항목 수명주기 작업을 수행하는 Hibernate 2 차 수준 캐시를 사용하는 것입니다.

  2. from https://stackoverflow.com/questions/34763402/proper-cache-usage-in-spring-hibernate by cc-by-sa and MIT license