Spring Caching – How zum verwalten von caches in verschiedenen Bereichen?

Arbeite ich an einem Spring-MVC-Anwendung mit Spring Caching Abstraktion. Die cache-Implementierung ist EhCache in der version 2.6.5

Nun brauche ich zwei caches – eine application-scoped und anderen session-scoped, da einige Methode die Ergebnisse basieren auf der web-Sitzung. Was ist der beste Weg, dies zu erreichen?

Dachte ich, ich kann nicht registrieren die session-cache in der gleichen Cache-Manager als globaler cache, da es vielleicht keine Sitzung verfügbar, wenn der Frühling versucht zu injizieren, der Cache-Manager. Daher habe ich ein anderes Cache-Manager die session-scoped…

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

Leider funktioniert das nicht richtig, der Frühling schafft das sessionCacheManager nur einmal. So bekomme ich die zwischengespeicherten Ergebnisse über alle Sitzungen.

  • Können Sie fügen Sie Informationen, wo Sie diese caches und cache-Manager? Ich glaube, Ihr CompositeCacheManager verursacht Sie Probleme.
  • Ich benutze @Cacheable("sessionCache") und @Cacheable("globalCache") auf meine service-Methoden. Die CompositeCacheManager funktioniert wie ein Charme, es ist in der Lage, um mehrere CacheManagers…



One Reply
  1. 1

    Können Sie nur speichern von serialisierbaren beans in einer Sitzung. Natürlich, solange Sie nur einen einzelnen Knoten-Anwendung, können Sie technisch alles speichern, indem Sie die Objekt-Referenz. Es wird jedoch nicht zur Verfügung, nachdem Sie neu starten.

    Wenn Sie wollen, um cache-Daten-die Zugehörigkeit zu einer session definieren Sie einen globalen cache mit einem zusammengesetzten Schlüssel (session-id, die Sie-Taste).

    • Es ist nicht mein Ziel zu serialisieren session-cache… ich würde lieber mit mehreren caches für verschiedene Zwecke. Da die cache-Konfiguration variiert erheblich! z.B. ewig, nicht ewig

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.