2012-06-11 2 views
4

Google 구아바 CacheBuilder을 사용하여 Cache 인스턴스를 만듭니다. 이름에서 알 수 있듯이,maxSize가 지정되지 않은 경우 Google Guava 캐시가 SIZE 항목을 퇴장합니다.

return CacheBuilder.newBuilder() 
      .initialCapacity(initialCapacity) 
      .expireAfterAccess(expirationInterval, TimeUnit.SECONDS) 
      .removalListener(LOGGING_AUTOEVICTION_ONLY_REMOVAL_LISTENER) 
      .build(); 

내 제거 수신기는 다음과 같습니다 :

private static final RemovalListener<MyKey, MyRecord> LOGGING_AUTOEVICTION_ONLY_REMOVAL_LISTENER 
     = new RemovalListener<MyKey, MyRecord>() { 
      @Override 
      public void onRemoval(RemovalNotification<MyKey, MyRecord objectObjectRemovalNotification) { 
       if (objectObjectRemovalNotification.wasEvicted()) { 
        log.debug("Entry evicted from cache: {} - Reason: {}", objectObjectRemovalNotification, objectObjectRemovalNotification.getCause()); 
       } 
      } 
     }; 

마지막으로, 나는 내 캐시 오직 get 항목, 여기 get(K key, Callable<? extends V> valueLoader)

를 사용하여 내 코드는 다음과 같이 보입니다 문제 : 위의 코드에서 다음 로그 출력이 표시됩니다.

19:08:03.287 DEBUG [MyCache] - Entry evicted from cache: MyKey[123][email protected] - Reason: SIZE

CacheBuilder 호출에서 maximumSize()을 사용하지 않았을 때 레코드가 내 캐시에서 제거되는 이유는 무엇입니까? 나는 그것이 "무게"와 관련이 있다고 생각합니다. 그렇다면 만료 시간 전에 캐시 항목이 제거되지 않도록하려면 maxWeight()에 대해 알아야 할 사항은 무엇입니까?

참고 Google 구아바 사이트의 Caches Explained에 대해 알고 있습니다.

+0

아니요, 무게 고려 사항과 상관없이 발생하지 않아야합니다. 오류를 보여주는 SSCCE를 구성 할 수 있습니까? –

+0

또한, 이것은 SO 질문보다는 버그 보고서로 더 적합 할 것 같습니다. –

+0

Bleh. 추가 질문 : 구아바의 어떤 버전을 사용하고 있습니까? 나는 근원을보고있다. 그리고 이것은 꽤 평평하게 불가능한 것처럼 보인다. –

답변

7

expirationInterval이 실수로 0과 같을 수 있습니까? expireAfterAccess 문서로 "duration이 0이면이 메서드는 maximumSize(0)으로 넘깁니다."

+0

우. 나는 그런 생각조차하지 않았다. 사실 그럴 것 같아. –

+0

그건 그랬어. 나는 "0"으로 설정 만료가 "maximumSize (0)"과 동의어임을 간과했다. 나는 표준 솔루션이 Ticker를 사용하는 것으로 의심되지만 Long.MAX_VALUE로 만료를 설정하고있다. 생각? – noahlz

+0

티커는 테스트 목적으로 만 사용됩니다. 만료를 MAX_VALUE로 설정하는 대신, 설정하지 않아도된다는 아이디어가 있습니다. –

관련 문제