Question

J'envisage d'utiliser pour mettre en œuvre un cache soit JBoss Cache ou Ehcache. Après avoir examiné les deux API I a l'intuition que JBoss est probablement un peu plus de mémoire efficace que Ehcache car il peut mettre cru objets dans le cache tout en Ehcache doit envelopper les données dans un objet Element.

Je mis en place un banc rapide insertion à plusieurs reprises, la valeur tuples clé dans le cache. Les classes et valeurs clés sont très simples:

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 + "]";
    }
}

Valeur:

public class Value implements Serializable{

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -499278480347842883L;
}

Lors de l'insertion 100000 objets le résultat sur la mémoire où tout ce que je pensais, Ehcache utilisé 13396 octets pour stocker les objets alors que JBoss utilise 5712 octets pour la même opération (ce qui est bon puisque le même test en utilisant un ConcurrentHashMap utilisé 5680 octets).

Mais quand je regardais les temps d'exécution, j'ai eu une très mauvaise surprise: il a fallu Ehcache 300 millisecondes pour effectuer mon test alors qu'il a fallu 44 secondes pour JBossCache faire la même chose. Je suis sûr qu'il ya quelque chose de pourri de ma configuration JBoss expliquant cette différence.

Ehcache est initialisé par programme comme celui-ci:

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);

cache JBoss est créé en utilisant Spring avec la configuration de haricot suivant:

<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>

et le fichier jbossCacheConf.xml suivant:

<?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>

Par souci d'exhaustivité le test est Ehcache:

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

Alors que celui JBoss est:

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

Quelque chose ne va dans mon setup / référence?

Était-ce utile?

La solution

Je suis passé à Infinispan et je n'ai pas de problèmes de performances étranges alors.

Autres conseils

Attention à la configuration par défaut JBossCache. Il pourrait être possible que par défaut JBossCache essayer de trouver et de données répliquées sur un nœud esclave.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top