[SPRING] Spring / Hibernate에서의 적절한 캐시 사용법
SPRINGSpring / 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.귀하의 접근 방식은 작동하지 않거나 유지 보수하기가 어려울 것입니다. 수동으로 캐시를 유지할 필요가있는 것 외에도, 자신의 캐시에서 리턴 한 엔티티가 항상 분리되므로 엔티티 인스턴스를 관리하려는 경우 엔티티 인스턴스를 각각의 새로운 Hibernate 세션 (지속성 컨텍스트)으로 다시 병합해야합니다.
귀하의 접근 방식은 작동하지 않거나 유지 보수하기가 어려울 것입니다. 수동으로 캐시를 유지할 필요가있는 것 외에도, 자신의 캐시에서 리턴 한 엔티티가 항상 분리되므로 엔티티 인스턴스를 관리하려는 경우 엔티티 인스턴스를 각각의 새로운 Hibernate 세션 (지속성 컨텍스트)으로 다시 병합해야합니다.
최선의 방법은 자동으로 캐시 항목 수명주기 작업을 수행하는 Hibernate 2 차 수준 캐시를 사용하는 것입니다.
from https://stackoverflow.com/questions/34763402/proper-cache-usage-in-spring-hibernate by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @Autowired with JUnit 테스트 (0) | 2019.05.18 |
---|---|
[SPRING] Spring : ManyToOne 엔티티를 가져올 때 참조 엔티티 (OneToMany)가 JSON에 표시되지 않습니다. (0) | 2019.05.18 |
[SPRING] jQuery DataTables - DataTable을 다시 초기화 할 수 없습니다. (0) | 2019.05.18 |
[SPRING] Spring Cloud Stream 및 @Publisher 주석 호환성 (0) | 2019.05.18 |
[SPRING] OPTIONS / DELETE에 대해 봄 부팅 데이터 Rest + CORS가 올바르게 설정되지 않음 (0) | 2019.05.18 |