2016-12-09 8 views
1

ehcacheで永続性に問題があります。最初の起動時にキャッシュ自体は正常に動作しますが、Tomcatサーブレットを再起動すると古い値が記憶されません。 ehcacheを初期化するためのコードです。私はxmlを使用していません。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)); 

「before」ログステートメントの結果は、再起動後も常にNULLです。

+0

はおそらく、私は完全に「持続性」は、この文脈で意味を理解していませんか?キャッシュをディスクに保存しておいて、サーバーの再起動時に再ロードできるようにすることがポイントだと思いました。 – atopcu

+0

ドキュメントはあなたが正しいと示唆していますが、私はあなたが何が欠けているのか分かりません。我慢して。 –

答えて

2

ディスクリソースプールを永続的に宣言する必要があります。これはデフォルトではありません。

.disk(20, MemoryUnit.MB, true) 

あなたのテストは完全に機能します。

キャッシュマネージャクローズを含む完全なコード:

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

さらに、 'CacheManager'は' close() 'でなければなりません。 –

+0

あなたは正しいです。私は私の例で筋肉の記憶をしました:-)私の答えを編集させてください – Henri