2017-08-28 5 views
0

として機能していないと EHCacheなど3は、私は私のSpringアプリケーションのためのEHCacheなどを使用している地図

あなたは私はハッシュマップとも同じデータを追加しているの下に表示された場合

を期待通り、私はその作業を考えていませんEhcache ..しかし、私はehCacheからそれを取得しようとしたときに、それはnullを印刷します

私はキャッシュまたは私が逃した何かを初期化する方法に何か問題はありますか?

私のクラス

@Named 
public class Myclass extends DataLoader { 
private static final Logger LOGGER = Logger.getLogger(Myclass.class.getName()); 
@Inject 
private DictionaryInitializer dictionaryLoader; 

@Inject 
@Named("fileLoader") 
private FileLoader fileLoader; 

private Cache<String,Object> dictionary; 

@PostConstruct 
@Override 
public void loadResource() { 
    List<String> spellTerms = null; 
    dictionary=dictionaryLoader.getCache(); 
    String fileName = "C:\\spelling.txt"; 
    spellTerms = fileLoader.loadResource(fileName);  
    HashMap<String,Object> dictData = new HashMap<>(); 
    for(String line:spellTerms) 
    {   
     for (String key : parseWords(line)) 
     { 
      HashMap<String,Object> tempMap = dictionaryUtil.indexWord(key); 

      if(tempMap!=null && !tempMap.isEmpty()) 
      { 
      Set<Map.Entry<String, Object>> entries = tempMap.entrySet(); 
      for(Map.Entry<String, Object> entry:entries) 
      { 
       dictionary.put(entry.getKey(), entry.getValue()); 
      } 
      } 
      dictData.putAll(tempMap); 

     } 
    } 
    System.out.println(dictData.get("urcle")); //prints 45670 
    System.out.println(dictionary.get("urcle")); // prints null 


}  

private static Iterable<String> parseWords(String text) 
{ 
    List<String> allMatches = new ArrayList<String>(); 
    Matcher m = Pattern.compile("[\\w-[\\d_]]+").matcher(text.toLowerCase()); 
    while (m.find()) { 
     allMatches.add(m.group()); 
    } 
    return allMatches; 
} 

} 

私DictionaryInitializerは、私は問題を発見した

public class DictionaryInitializer { 
private static final Logger LOGGER = Logger.getLogger(DictionaryInitializer.class.getName()); 
private Cache<String,Object> dictionary; 
@PostConstruct 
public void initializeCache() { 
    CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()  

      .build(true); 
    this.dictionary = cacheManager.createCache("myCache", 
      CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Object.class, 
        ResourcePoolsBuilder.heap(100)).build()); 
    LOGGER.info("Dictionary loaded"); 
} 
public Cache<String,Object> getCache(){ 
    return dictionary; 
} 
public void setCache(Cache<String,Object> dictionary) { 
    this.dictionary=dictionary; 
} 
} 

答えて

0

以下のようなものです。

ヒープが100エントリしかないため、キャッシュに最初の100エントリだけが入ります。

これを修正して正常に動作します。

+0

héhé!キャッシュサイジングに注意してください! –

+0

気をつけてください。キャッシュはマップではありません。あなたが一度もメモリに残すべきデータを読んでいるなら、それはあなたが望むキャッシュではありません。キャッシュは、たとえ実際の実装がそれを一般的にやっていなくても、それが気になるときには退去してnullを返すかもしれません。したがって、データをヒープに保ちたい場合は、マップが必要です。 – Henri

関連する問題