2017-04-21 3 views
1

주어진 예에서, 제 3자가 자신이 데이터 구조 (키 - 값 쌍)에 액세스한다고 생각하도록 캐시 작업을 추상화하는 상상 된 ExampleCache 클래스의 내부에 read-through CacheLoaderWriter을 정의하는 내부 클래스가 있습니다. 내 질문에 loadAll 메서드가 포함됩니다.Ehcache에 병렬로 쓸 위험이 있습니까?

loadAll이 EhCache에 동시에 쓰도록 작성된 경우 레코드 변경 또는 불안정의 위험이 있습니까? 사용자 정의 동시성을 처리하도록 EhCache가 구축 되었습니까?

class ExampleCacheLoader implements CacheLoaderWriter<String, ArrayList> { 


      private HashMap<String, ArrayList> map; 

      public CacheLoader() { 
       map = new HashMap<>(); 
      } 

      @Override 
      public ArrayList<String> load(String s) throws Exception { 

       Map.Entry<String, ArrayList<String>> personEntry = getPersonAliases(s); 
       if(!map.containsKey(personEntry.getKey())){ 
        map.put(personEntry.getKey(), personEntry.getValue()); 
       } 
       return map.get(personEntry.getKey()); 
      } 

      @Override 
      public Map<String, ArrayList> loadAll(
        Iterable<? extends String> keys) throws Exception { 
       Map<String, ArrayList> localTempMap = new HashMap<>(); 
       Stream keyStream = StreamSupport.stream(entries.spliterator(), true); 
       keyStream.forEach(key -> { 
        localTempMap.putIfAbsent(
          getterExample(key).getKey(), 
          getterExample(key).getValue()); 
       }); 

       map.putAll(localTempMap); 
       return localTempMap; 
      } 
      . 

      . 

      . 

답변

1

Ehcache는 동시 액세스 용으로 설계된 라이브러리이므로 최상의 스레딩과 동시 발생 변이 및 관련 문제를 최상의 방법으로 처리합니다.

이제 CacheLoaderWriter에 대한 이해가 어려워 보입니다. CacheLoaderWriter에서 캐시에 액세스하지 않아도됩니다. 필요한 경우 매핑이 요청되었지만 캐시에서 찾을 수없는 경우 load* 메쏘드의 경우 CacheLoaderWriter에 캐시가 액세스합니다.

CacheLoaderWriter 구현 은 Ehcache가 동시에 사용하는 것처럼 스레드 안전해야합니다. 또한 제안 된 구현에서 이 수행 할 작업과 중복되는 CacheLoaderWriter 내부의 상태를 유지하고 있습니다 ... 달성하려는 작업을 올바르게 이해하면.

+0

그건 완전히 이해가됩니다. 저는 Java로 캐싱하기가 비교적 쉽습니다. 이전 경험은 C와 C++에서만 가능했기 때문에 약간의 오해가 있었기 때문에 운이 좋았습니다. – Wes