[SPRING] Spring 캐시 캐시에 다중 캐시 관리자 구성을 갖는 방법
SPRINGSpring 캐시 캐시에 다중 캐시 관리자 구성을 갖는 방법
내 웹 응용 프로그램에서 여러 개의 스프링 캐시 관리자를 구성하려고하고 프로젝트의 여러 위치에서 다른 캐시 관리자를 사용할 수 있습니다. 이것을 할 수있는 방법이 있습니까?
해결법
-
==============================
1.이를 수행 할 수있는 여러 가지 방법이 있으며 올바른 대답은 캐시 사용에 따라 다릅니다.
이를 수행 할 수있는 여러 가지 방법이 있으며 올바른 대답은 캐시 사용에 따라 다릅니다.
CacheManager A를 사용 사례의 90 %에 사용하고 B를 10 %에 사용하는 경우 A (CacheConfigurerSupport 확장을 통해 지정해야 함)와 같은 기본 CacheManager를 만드는 것이 좋습니다.
@Configuration @EnableCaching public class CacheConfig extends CachingConfigurerSupport { @Override @Bean // not strictly necessary public CacheManager cacheManager() { ... CacheManager A } @Bean public CacheManager bCacheManager() { ... CacheManager B } }
그런 다음 10 % 유스 케이스의 경우 다른 캐시 관리자를 사용해야하는 클래스의 맨 위에 CacheConfig를 추가합니다
@CacheConfig(cacheManager="bCacheManager") public class MyService { /*...*/ }
하나의 메소드에만 다른 캐시 관리자를 사용해야하는 경우, 메소드 레벨에서도이를 지정할 수 있습니다
@Cacheable(cacheNames = "books", cacheManager = "bCacheManager") public Book findById(long id) { /*...*/ }
이 상황에 있지 않다면 어떤 캐시 관리자가 사안별로 사용되어야하는지 알 수있는 방법이 필요합니다. 대상 유형 (MyService) 또는 캐시 이름 (책)을 기반으로 할 수 있습니다. 해당 번역을 수행하는 CacheResolver를 구현해야합니다.
@Configuration @EnablleCaching public class CacheConfig extends CachingConfigurerSupport { @Override public CacheResolver cacheResolver() { ... } }
자세한 내용은 CacheResolver의 javadoc을 확인하십시오. 구현시, 관리자 (manager)를 결정하기 위해 로직을 기반으로 내부적으로 호출하는 여러 CacheManager 인스턴스 (bean 또는 not)를 가질 수 있습니다.
나는 당신이 "모듈"을 언급하고 있다는 의견을 보았습니다. 캐싱은 인프라 문제이므로 응용 프로그램 수준에서 결정을 내릴 것을 강력히 권고합니다. 캐시를 "로컬"로 태그하고 다른 태그는 "클러스터"로 태그 지정할 수 있습니다. 그러나 이름을 쉽게 이해할 수 있도록 명명법을 사용해야합니다. 모듈 수준에서 캐시 관리자를 선택하지 마십시오.
이 블로그 게시물은 다른 예제와 함께 이것을 보여줍니다.
-
==============================
2.@Stephane Nicoll이 설명했듯이 몇 가지 옵션이 있습니다. 커스텀 CacheResolver에 대한 정보를 제공하려고한다. CacheResolver에는 한 가지 방법이 있습니다.
@Stephane Nicoll이 설명했듯이 몇 가지 옵션이 있습니다. 커스텀 CacheResolver에 대한 정보를 제공하려고한다. CacheResolver에는 한 가지 방법이 있습니다.
Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context);
캐시 가능한 연산의 클래스, 메소드, 인수 등에 컨텍스트를 제공합니다.
기본적인 형태로 :
public class CustomCacheResolver implements CacheResolver { private final CacheManager cacheManager; public CustomCacheResolver(CacheManager cacheManager){ this.cacheManager = cacheManager; } @Override public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) { Collection<Cache> caches = getCaches(cacheManager, context); return caches; } private Collection<Cache> getCaches(CacheManager cacheManager, CacheOperationInvocationContext<?> context) { return context.getOperation().getCacheNames().stream() .map(cacheName -> cacheManager.getCache(cacheName)) .filter(cache -> cache != null) .collect(Collectors.toList()); } }
여기에서는 간결함을 위해 하나의 CacheManager를 사용합니다. 그러나 다른 CacheManagers를 CacheResolver에 바인딩하고보다 세부적인 선택을 할 수 있습니다. 클래스 이름이 X이면 GuavaCacheManager를 사용하고, 그렇지 않으면 EhCacheCacheManager를 사용하십시오.
이 단계가 끝나면 CacheResolver를 등록해야한다 (다시 CacheManagers를 여기에 바인딩 할 수있다).
@Configuration @EnableCaching public class CacheConfiguration extends CachingConfigurerSupport { @Bean @Override public CacheManager cacheManager() { // Desired CacheManager } @Bean @Override public CacheResolver cacheResolver() { return new CustomCacheResolver(cacheManager()); } }
마지막 단계로 @Cacheable, @CachePut, @CacheConfig 등의 주석 중 하나에서 CustomCacheResolver를 지정해야합니다.
@Cacheable(cacheResolver="cacheResolver")
여기에서 코드 샘플을 볼 수 있습니다.
from https://stackoverflow.com/questions/38570211/how-to-have-multiple-cache-manager-configuration-in-spring-cache-java by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Security 3.2에서 Access-Control-Origin 필터를 문제없이 설치하는 방법 (0) | 2019.01.14 |
---|---|
[SPRING] Spring : 프로필에 따라 다른 속성 파일 삽입 (0) | 2019.01.14 |
[SPRING] Spring에서 무시되는 Jackson 주석 (0) | 2019.01.13 |
[SPRING] 봄 - jsp 파일에 이미지 표시 (0) | 2019.01.13 |
[SPRING] 왜 Spring의 jdbcTemplate.batchUpdate ()가 느린가? (0) | 2019.01.13 |