Производительность JBoss Cache и Ehcache - PullRequest
9 голосов
/ 14 июня 2011

Я планирую использовать для реализации кеша JBoss Cache или Ehcache. Посмотрев на оба API-интерфейса, я понял, что JBoss, вероятно, немного более эффективно использует память, чем Ehcache, поскольку он может помещать raw объекты в кеш, а Ehcache нужно обернуть данные в объект Element.

Я настроил быструю скамью, вставляя несколько раз ключ, значение кортежей в кеш. Классы ключей и значений очень просты:

Key:

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 создается с использованием 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 один:

for (int i = 0; i < ITEM_COUNT; i++) {
    this.processNode.put(new Key(i), new Value());
}

Что-то не так в моих настройках / тестах?

Ответы [ 2 ]

4 голосов
/ 20 июня 2011

Я перешел на infinispan , и у меня нет никаких странных проблем с производительностью.

0 голосов
/ 14 июня 2011

Будьте осторожны с конфигурацией JBossCache по умолчанию.Возможно, по умолчанию JBossCache попытается найти и реплицировать данные на подчиненном узле.

...