具有Spring Cache管理器的EH-Cache无法按预期工作

时间:2016-02-04 05:48:06

标签: java spring spring-mvc caching ehcache

我们有基于spring(3.2.9.Release)的java web应用程序,并使用hibernate进行db操作。 我们目前有使用Dynacache的缓存机制,它通过WebSphere服务器配置并使用jndi映射。我们在第一页加载时从数据库中检索所有内容并将其存储在Dynacache中。由于每次都是外部呼叫,我们希望实现Eh-Cache并提高性能。但令人惊讶的是,Eh-Cache的性能比Dynacache要小,并且需要很长时间来加载页面。以下是我们为Eh-Cache配置的配置:

xml配置:

<bean id="cacheService" class="com.wlp.sales.ols.core.api.cache.CacheService"></bean>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="ehcache" />
    </bean>

<bean id="ehcache"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="/WEB-INF/configs/EhCache/ehcache.xml" />
        <property name="shared" value="true" />

ehcache.xml中

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
    monitoring="autodetect" dynamicConfig="true">

    <cache name="contentCache" 
        maxEntriesLocalHeap="10000"
        maxEntriesLocalDisk="1000" 
        eternal="true" 
        diskSpoolBufferSizeMB="20"
        timeToIdleSeconds="0" timeToLiveSeconds="0"
        memoryStoreEvictionPolicy="LRU" 
        transactionalMode="off">
        <persistence strategy="localTempSwap" />
    </cache>

</ehcache> 

依赖关系:

<!-- ehCache -->
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.10.1</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>

我们有一个缓存实现类,它将使用get和put方法生成缓存键,以便从db检索并作为键值对放入缓存映射。

public Object get(CdiRequest request) {
        Object cdiObject = cacheService.get(request.getContentElement()
                .getContentType(), keyBuilder.build(request));
        return cdiObject instanceof CdiResponse ? (CdiResponse) cdiObject
                : request;
}

//放置方法实施:

cacheService.put(cdiResponse.getCdiRequest().getContentElement()
                    .getContentType(),
                    keyBuilder.build(cdiResponse.getCdiRequest()), cdiResponse);

实施班级:

 public class CacheService implements ApplicationContextAware{
    @Autowired
    private CacheManager cacheManager;
    private ApplicationContext applicationContext;

    public Object get(String applnName, Object key) {

            Cache  cache = cacheManager.getCache("contentCache");
            return cache.get(key);
      }

      public boolean put(String applnName, Object key, Object value) {
          Cache  cache =  cacheManager.getCache("contentCache");
          cache.put(key, value);
          return true;
      }
}

刷新或重新加载每页需要大约60秒到80秒,而dynacache只需3-4秒。请告知是否有任何错误或可以更好地完成任何事情。

2 个答案:

答案 0 :(得分:0)

为什么你不想在Spring中为Cache提供标准注释,并在从DB获取值的方法中使用它?:

@Cacheable(value="contentCache", key="#name")

那么你可以从数据库中获取内容并存储在缓存中吗?如果有变化,您可以使用CacheEvict

答案 1 :(得分:0)

有几件事可以改进:

  1. 在配置级别
    • 你真的需要磁盘存储吗?它增加了开销,因为必须对内容进行序列化/反序列化。
    • 如果您需要它,您需要将磁盘存储区的大小设置为大于onheap的磁盘存储区,因为所有映射都将存在于磁盘存储区中。因此,使用当前配置,您实际上将onheap大小限制为1000
  2. 在使用级别,您实际上正在使用缓存作为内存存储,因为您没有逻辑来处理未找到映射的情况。现在,也许您正在缓存的是一组已知的密钥,并且小于您设置的密钥。不过,这可能是问题的后期原因。
  3. 关于性能问题,如果您需要帮助来跟踪问题,则需要提供更详细的信息。