programing

스프링 캐시에서 @Cacheable 주석의 늘 값을 캐시하지 않도록 하려면 어떻게 해야 합니까?

procenter 2023. 3. 16. 23:49
반응형

스프링 캐시에서 @Cacheable 주석의 늘 값을 캐시하지 않도록 하려면 어떻게 해야 합니까?

메서드가 null 값을 반환할 경우 이러한 메서드의 경우 결과를 @Cacheable annotation에 캐시하지 않도록 지정할 수 있는 방법이 있습니까?

@Cacheable(value="defaultCache", key="#pk")
public Person findPerson(int pk) {
   return getSession.getPerson(pk);
}

업데이트: 작년 11월에 제출된 null 값 캐싱에 관한 JIRA 문제이며, 아직 해결되지 않았습니다.[#SPR-8871] @Cable 조건에서는 반환값을 참조할 수 있습니다 - Spring Projects Issue Tracker

만세, 스프링 3.2 현재 프레임워크는 스프링 SPEL을 사용하여 이를 허용합니다.unless캐시블을 둘러싼 자바 문서의 메모:

http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/cache/annotation/Cacheable.html

다음 경우를 제외하고 public abstract 문자열

메서드 캐싱을 거부하기 위해 사용되는 Spring Expression Language(SpEL) 속성.

condition()과 달리 이 식은 메서드가 호출된 후에 평가되므로 결과를 참조할 수 있습니다.기본값은 " 입니다. 이는 캐싱이 거부되지 않음을 의미합니다.

중요한 건unless는 메서드가 호출된 후에 평가됩니다.키가 이미 캐시에 있는 경우 메서드는 실행되지 않으므로 이 방법은 매우 적합합니다.

따라서 위의 예에서는 다음과 같이 주석을 달기만 하면 됩니다(#result는 메서드의 반환값을 테스트하는 데 사용할 수 있습니다).

@Cacheable(value="defaultCache", key="#pk", unless="#result == null")
public Person findPerson(int pk) {
   return getSession.getPerson(pk);
}

이 상태는 늘 캐시를 허용하는 Ehcache와 같은 플러그형 캐시 구현을 사용할 때 발생할 수 있습니다.사용 사례 시나리오에 따라 바람직한 경우와 바람직하지 않은 경우가 있습니다.

답변은 현재 갱신되지 않았습니다.Spring 3.2 이후의 경우 Tech Trip의 답변 OP: 자유롭게 수락으로 표시하십시오.

불가능할 것 같습니다(스프링에 조건부 캐시 제거가 있는데도)@CacheEvict앞의 파라미터호출이 false로 설정되었습니다(기본값).CacheAspectSupportclass는 반환된 값이 이전 어디에도 저장되지 않았음을 나타냅니다.inspectAfterCacheEvicts(ops.get(EVICT));불러.

protected Object execute(Invoker invoker, Object target, Method method, Object[] args) {
    // check whether aspect is enabled
    // to cope with cases where the AJ is pulled in automatically
    if (!this.initialized) {
        return invoker.invoke();
    }

    // get backing class
    Class<?> targetClass = AopProxyUtils.ultimateTargetClass(target);
    if (targetClass == null && target != null) {
        targetClass = target.getClass();
    }
    final Collection<CacheOperation> cacheOp = getCacheOperationSource().getCacheOperations(method, targetClass);

    // analyze caching information
    if (!CollectionUtils.isEmpty(cacheOp)) {
        Map<String, Collection<CacheOperationContext>> ops = createOperationContext(cacheOp, method, args, target, targetClass);

        // start with evictions
        inspectBeforeCacheEvicts(ops.get(EVICT));

        // follow up with cacheable
        CacheStatus status = inspectCacheables(ops.get(CACHEABLE));

        Object retVal = null;
        Map<CacheOperationContext, Object> updates = inspectCacheUpdates(ops.get(UPDATE));

        if (status != null) {
            if (status.updateRequired) {
                updates.putAll(status.cUpdates);
            }
            // return cached object
            else {
                return status.retVal;
            }
        }

        retVal = invoker.invoke();

        inspectAfterCacheEvicts(ops.get(EVICT));

        if (!updates.isEmpty()) {
            update(updates, retVal);
        }

        return retVal;
    }

    return invoker.invoke();
}

스프링 주석인 경우

@Cacheable(value="defaultCache", key="#pk",unless="#result!=null")

동작하지 않습니다.다음으로 시도해 주세요.

@CachePut(value="defaultCache", key="#pk",unless="#result==null")

저는 좋아요.

언급URL : https://stackoverflow.com/questions/12113725/how-do-i-tell-spring-cache-not-to-cache-null-value-in-cacheable-annotation

반응형