Производительность JBoss Cache и Ehcache
-
27-10-2019 - |
Вопрос
Я собираюсь использовать для реализации кэша JBoss Cache или Ehcache. Посмотрев на оба API, у меня есть интуиция, что JBoss, вероятно, немного более эффективна память, чем Ehcache, поскольку он может положить сырой объекты в кэш, в то время как ehcache необходимо обернуть данные в Element
объект.
Я установил быструю скамейку, вставляющую многократно ключом, ценностные кортежи в кэше. Классы ключей и значений очень просты:
Ключ:
public class Key implements Serializable {
private static final long serialVersionUID = -2124973847139523943L;
private final int key;
public Key(int pValue) {
this.key = pValue;
}
public int getValue() {
return this.key;
}
@Override
public String toString() {
return "Key [key=" + this.key + "]";
}
}
Ценность:
public class Value implements Serializable{
/**
* serialVersionUID
*/
private static final long serialVersionUID = -499278480347842883L;
}
При вставке 100000 объектов результат в память, где я ожидал, EHCache использовал 13396 байтов для хранения объектов, в то время как JBoss использовал 5712 байтов для той же операции (что хорошо, поскольку тот же тест с использованием ConcurrentHashMap
Используется 5680 байтов).
Однако, когда я посмотрел на время исполнения, у меня был очень плохой сюрприз: Ehcache 300 миллисекунд, чтобы выполнить мой тест, в то время как для Jbosscache потребовалось 44 секунды, чтобы сделать то же самое. Я почти уверен, что в моей конфигурации JBoss есть что -то гнилое, объясняющее эту разницу.
Ehcache инициализируется программно, как это:
CacheConfiguration cacheConfiguration = new CacheConfiguration("MyCache", 0).diskPersistent(false).eternal(true)
.diskExpiryThreadIntervalSeconds(100000).transactionalMode(TransactionalMode.OFF);
final Configuration config = new Configuration();
config.setDefaultCacheConfiguration(cacheConfiguration);
this.cacheManager = new CacheManager(config);
cacheConfiguration.name("primaryCache");
this.cache = new net.sf.ehcache.Cache(cacheConfiguration);
this.cacheManager.addCache(this.cache);
JBoss Cache создается с использованием Spring со следующей конфигурацией бобов:
<bean id="cache" class="org.jboss.cache.Cache" factory-bean="cacheFactory" factory-method="createCache">
<constructor-arg>
<value type="java.io.InputStream">/META-INF/jbossCacheSimpleConf.xml</value>
</constructor-arg>
</bean>
и следующее jbossCacheConf.xml
файл:
<?xml version="1.0" encoding="UTF-8"?>
<jbosscache xmlns="urn:jboss:jbosscache-core:config:3.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:jboss:jbosscache-core:config:3.2 http://www.jboss.org/schema/jbosscache/jbosscache-config-3.2.xsd">
</jbosscache>
Для полноты теста ehcache:
for (int i = 0; i < ITEM_COUNT; i++) {
this.cache.put(new Element(new Key(i), new Value()));
}
Пока JBoss One:
for (int i = 0; i < ITEM_COUNT; i++) {
this.processNode.put(new Key(i), new Value());
}
Что -нибудь не так в моей настройке/тесте?
Решение
Я переключился на Infinispan И тогда у меня нет странных проблем с производительностью.
Другие советы
Будьте осторожны с конфигурацией JBossCache по умолчанию. Возможно, что по умолчанию JBossCache попытаться найти и воспроизвести данные на подчиненном узле.