我们有基于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秒。请告知是否有任何错误或可以更好地完成任何事情。
答案 0 :(得分:0)
为什么你不想在Spring中为Cache提供标准注释,并在从DB获取值的方法中使用它?:
@Cacheable(value="contentCache", key="#name")
那么你可以从数据库中获取内容并存储在缓存中吗?如果有变化,您可以使用CacheEvict
。
答案 1 :(得分:0)
有几件事可以改进:
1000
。关于性能问题,如果您需要帮助来跟踪问题,则需要提供更详细的信息。