atopcu
atopcu

Reputation: 233

EhCache 3.1.3 persistence issue

I'm having issues with persistence in ehcache. The cache itself works fine when first started but it does not remember the old values when I restart my tomcat servlet. Here's my code for initializing ehcache. I'm not using any xml.

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));

Result of the "before" log statement is always null after a restart.

Upvotes: 1

Views: 2647

Answers (1)

Henri
Henri

Reputation: 5721

You need to declare your disk ressource pool as persistent. It is not by default.

.disk(20, MemoryUnit.MB, true)

Then your test works perfectly.

The complete code including closing the cache manager:

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));
    }
  }
}

Upvotes: 4

Related Questions