2017-07-27 22 views
0

私はspring mvcでEchcacheを使用しようとしています。したがって、このために次のようなJava構成使用しています:Spring mvc Ehcache issue

public net.sf.ehcache.CacheManager ehCacheManager() { 
    net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration(); 
    CacheConfiguration cacheConfig = new CacheConfiguration(); 
    cacheConfig.setName("test"); 
    cacheConfig.setMaxEntriesLocalHeap(0); 
    cacheConfig.setMaxEntriesLocalDisk(10); 
    cacheConfig.setTimeToLiveSeconds(500); 
    config.addCache(cacheConfig); 
    DiskStoreConfiguration diskStoreConfiguration = new DiskStoreConfiguration(); 
    diskStoreConfiguration.setPath("C:/MyCache1"); 
    config.addDiskStore(diskStoreConfiguration); 
    return net.sf.ehcache.CacheManager.newInstance(config); 
} 

をし、キャッシュ用@cachable注釈を使用。それは正しく動作します。すべてのキャッシュされたデータはメモリに保存されます。サイズがゼロのファイルtest.dataを作成します。今私のクエストはディスクにキャッシュされたデータを書き込む方法ですか?

答えて

2

ディスクに保存する設定を次の行を追加します。

cacheConfig.setDiskPersistent(真の);

public net.sf.ehcache.CacheManager ehCacheManager() { 
    net.sf.ehcache.config.Configuration config = new 
    net.sf.ehcache.config.Configuration(); 
    CacheConfiguration cacheConfig = new CacheConfiguration(); 
    cacheConfig.setName("test"); 
    cacheConfig.setMaxEntriesLocalHeap(0); 
    cacheConfig.setMaxEntriesLocalDisk(10); 
    cacheConfig.setTimeToLiveSeconds(500); 
    cacheConfig.setDiskPersistent(true); 
    config.addCache(cacheConfig); 
    DiskStoreConfiguration diskStoreConfiguration = new 
    DiskStoreConfiguration(); 
    diskStoreConfiguration.setPath("C:/MyCache1"); 
    config.addDiskStore(diskStoreConfiguration); 
    return net.sf.ehcache.CacheManager.newInstance(config); 
} 
  • 注:このメソッドは、現在@Deprecatedされ、かつ持続性(PersistenceConfiguration)メソッドに置き換えられました。
+0

ありがとう、私はconfig.persistence(新しいPersistenceConfiguration()。strategy(PersistenceConfiguration.Strategy.LOCALTEMPSWAP));を使用しますが、動作しません。 – ali

+1

Strategy.LOCALTEMPSWAPは、メモリ内キャッシュ専用です。ディスクファイルを使用する場合は、Strategy.LOCALRESTARTABLEを使用してください。 - 注:LOCALRESTARTABLE永続性機能はエンタープライズ版のEhcacheで使用できます。 –

+0

なぜ私は 'ehcache'をディスクに書き込むためにスプリングプロバイダを使用しないのですか?' ehcache'メソッドを使用することを意味します – ali

1

他の答えで説明したように、キャッシュ自体にディスク層を使用させる必要があります。

最近のバージョンのEhcache 2.xを使用している場合は、コメントに示されている通りに cacheConfig.persistence(new PersistenceConfiguration().strategy(PersistenceConfiguration‌​.Strategy.LOCALTEMPS‌​WAP)); で実行する必要があります。 このオプションは非クラッシュプルーフのディスク層で、オプションStrategy.LOCALRESTARTABLEはクラッシュを処理しますが、エンタープライズ版のみであることに注意してください。

しかし、これで十分ではありません。アプリケーションがシャットダウンしたときに、キャッシュとキャッシュマネージャを正しく閉じる必要があります。これにより、すべてのエントリがフラッシュされ、インデックスファイルが作成されます。これらがなければ、再起動時にデータは破棄されます。

+0

私の問題は解決しました。アプリケーションを再起動すると、 '.index'ファイルと' .data 'ファイル。 'setTimeToLiveSeconds'が期限切れになったら、それを削除して新しいファイルを作成します。あなたの意見では 'setTimeToLiveSeconds'を30日にするのが妥当かどうか?どのようにこの問題を処理するのですか?ありがとう。 – ali

関連する問題