J'utilise EHCache pour ma demande de printemps et je ne pense pas que son travail comme prévuEHCache 3 ne fonctionne pas comme une carte
Si vous voyez ci-dessous, je suis d'ajouter les mêmes données à un hashmap et aussi Ehcache .. mais quand j'ai essayé de l'obtenir de l'ehCache il imprime null
Y at-il quelque chose de mal dans la façon dont j'ai initialisé le cache ou quelque chose que j'ai manqué.
Ma classe
@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;
}
}
Mon DictionaryInitializer est comme ci-dessous
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;
}
}
héhé! soyez prudent avec la taille du cache! –
Attention. Un cache n'est pas une carte. Si vous lisez des données qui devraient rester en mémoire pour toujours, ce n'est pas un cache que vous voulez. Un cache peut expulser et renvoyer une valeur nulle lorsqu'il en a envie (même si l'implémentation réelle ne le fera pas en général). Donc si vous voulez juste garder des données sur tas, vous voulez une carte. – Henri