2016-12-09 1 views
1

Je rencontre des problèmes de persistance dans ehcache. Le cache fonctionne correctement au démarrage, mais il ne se souvient pas des anciennes valeurs lorsque je redémarre ma servlet tomcat. Voici mon code pour initialiser ehcache. Je n'utilise aucun fichier XML.Problème de persistance EhCache 3.1.3

import org.ehcache.Cache; 
import org.ehcache.PersistentCacheManager; 
import org.ehcache.Status; 
import org.ehcache.config.builders.CacheConfigurationBuilder; 
import org.ehcache.config.builders.CacheManagerBuilder; 
import org.ehcache.config.builders.ResourcePoolsBuilder; 
import org.ehcache.config.units.EntryUnit; 
import org.ehcache.config.units.MemoryUnit; 

PersistentCacheManager persistentCacheManager = 
    CacheManagerBuilder.newCacheManagerBuilder() 
      .with(CacheManagerBuilder.persistence("/cache")) 
      .withCache("test-cache", 
        CacheConfigurationBuilder.newCacheConfigurationBuilder(
          Integer.class, String.class, 
          ResourcePoolsBuilder.newResourcePoolsBuilder() 
            .heap(1, EntryUnit.ENTRIES) 
            .offheap(1, MemoryUnit.MB) 
            .disk(20, MemoryUnit.MB) 
        ) 
      ).build(true); 
Cache cache = persistentCacheManager.getCache("test-cache", Integer.class, String.class); 

log.info("Cache get 1 before putting: " + cache.get(1)); 
for(int i = 0; i< 1000; i++) { 
    cache.put(i,"Hello"); 
} 
log.info("Cache get 1 after putting: " + cache.get(1)); 

Le résultat de l'instruction de consignation "avant" est toujours NULL après un redémarrage.

+0

Peut-être que je ne comprends pas bien ce que la « persistance » signifie dans ce contexte? Je pensais que le but était de garder le cache sauvegardé sur le disque afin qu'il puisse être rechargé au redémarrage du serveur. – atopcu

+0

Les docs suggèrent que vous avez raison, mais je n'ai aucune idée de ce qui vous manque. Sois patient. –

Répondre

2

Vous devez déclarer votre pool de ressources de disque comme persistant. Ce n'est pas par défaut.

.disk(20, MemoryUnit.MB, true) 

Ensuite, votre test fonctionne parfaitement.

Le code complet, y compris la fermeture du gestionnaire de cache:

import org.ehcache.Cache; 
import org.ehcache.PersistentCacheManager; 
import org.ehcache.config.units.EntryUnit; 
import org.ehcache.config.units.MemoryUnit; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import static org.ehcache.config.builders.CacheConfigurationBuilder.*; 
import static org.ehcache.config.builders.CacheManagerBuilder.*; 
import static org.ehcache.config.builders.ResourcePoolsBuilder.*; 

public class Main { 

    private static final Logger log = LoggerFactory.getLogger(Main.class); 

    public static void main(String[] args) { 
    try(PersistentCacheManager persistentCacheManager = 
     newCacheManagerBuilder() 
      .with(persistence("cache")) 
      .withCache("test-cache", 
       newCacheConfigurationBuilder(
        Integer.class, String.class, 
        newResourcePoolsBuilder() 
         .heap(1, EntryUnit.ENTRIES) 
         .offheap(1, MemoryUnit.MB) 
         .disk(20, MemoryUnit.MB, true) 
       ) 
      ).build(true)) { 
     Cache cache = persistentCacheManager.getCache("test-cache", Integer.class, String.class); 

     log.info("Cache get 1 before putting: " + cache.get(1)); 
     for (int i = 0; i < 1000; i++) { 
     cache.put(i, "Hello"); 
     } 
     log.info("Cache get 1 after putting: " + cache.get(1)); 
    } 
    } 
} 
+1

En outre, 'CacheManager' doit être' close() 'correctement –

+0

Vous avez raison. J'ai fait à travers la mémoire musculaire dans mon exemple :-) Laissez-moi éditer ma réponse – Henri