У нас есть веб-приложение java на основе весны (3.2.9.Release) и мы используем спящий режим для операций с БД. В настоящее время у нас есть механизм кэширования с использованием 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 для извлечения из базы данных и помещения в карту кеша в виде пары ключ-значение.
public Object get(CdiRequest request) {
Object cdiObject = cacheService.get(request.getContentElement()
.getContentType(), keyBuilder.build(request));
return cdiObject instanceof CdiResponse ? (CdiResponse) cdiObject
: request;
}
//Реализация метода Put:
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 секунд, тогда как динамическому кэшированию требуется всего 3-4 секунды. Пожалуйста, сообщите, если что-то делается неправильно или можно сделать лучше.