2016-05-24 14 views
1

私はSpring Caching Abstractionを使用してSpring MVCアプリケーションに取り組んでいます。キャッシュの実装はバージョン2.6.5のEhCacheですスプリングキャッシング - 異なるスコープのキャッシュを管理する方法は?

ここでは、いくつかのメソッドの結果がWebセッションに基づいているため、1つのアプリケーションスコープと別のセッションスコープが必要です。これを達成する最良の方法は何ですか?

私は、SpringがCacheManagerを挿入しようとしたときにセッションが利用できない可能性があるので、グローバルキャッシュと同じCacheManagerにセッションキャッシュを登録できないと考えました。したがって、私はセッションスコープで別のCacheManager ...

@Bean 
public net.sf.ehcache.Cache sessionCache() { 
    return new net.sf.ehcache.Cache(sessionCacheConfiguration()); 
} 

@Bean 
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) 
public CacheManager sessionCacheManager(){ 
    net.sf.ehcache.CacheManager sessionCacheManager = net.sf.ehcache.CacheManager.create(); 
    sessionCacheManager.setName("sessionCacheManager"); 
    sessionCacheManager.addCache(sessionCache()); 

    return new EhCacheCacheManager(sessionCacheManager); 
} 

@Bean 
public CacheManager globalCacheManager() { 
    return new EhCacheCacheManager(ehCacheCacheManager().getObject()); 
} 

@Bean 
public EhCacheManagerFactoryBean ehCacheCacheManager() { 
    EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean(); 
    cmfb.setConfigLocation(new ClassPathResource("ehcache.xml")); 
    cmfb.setShared(true); 
    return cmfb; 
} 

@Bean 
public CompositeCacheManager cacheManager(){ 
    return new CompositeCacheManager(globalCacheManager(), sessionCacheManager()){{ 
     setFallbackToNoOpCache(true); 
    }}; 
} 

は、残念ながら、これは正しく動作しませんを持って、春は一度だけsessionCacheManagerを作成します。だから私はすべてのセッションでキャッシュされた結果を得る。

+0

これらのキャッシュとキャッシュマネージャの使用場所に関する情報を追加できますか?あなたのCompositeCacheManagerが問題を引き起こしていると思います。 –

+0

私は自分のサービスメソッドで '@Cacheable(" sessionCache ")'と '@Cacheable(" globalCache ")'を使用します。 CompositeCacheManagerは魅力的に機能し、複数のCacheManagersを処理できます。 –

答えて

1

シリアル化可能なBeanは、セッションにのみ格納できます。もちろん、単一のアプリケーションノードしか持たない限り、オブジェクト参照によってすべてを技術的に保存することができます。ただし、再起動後は使用できなくなります。

セッションに属するデータをキャッシュする場合は、複合キー(session-id、you-key)を使用してグローバルキャッシュを定義します。

+0

セッションキャッシュをシリアル化するのは私の目標ではありません... 私はさまざまな目的のために複数のキャッシュを持つことをお勧めします。キャッシュ構成が大幅に変化するためです。例えば永遠ではなく永遠 –

関連する問題