Domanda

Sto pensando di utilizzare per implementare una cache JBoss Cache o Ehcache.Dopo aver esaminato entrambe le API, ho l'intuizione che JBoss sia probabilmente un po' più efficiente in termini di memoria di Ehcache poiché può mettere crudo oggetti nella cache mentre Ehcache deve racchiudere i dati in a Element oggetto.

Ho impostato un banco rapido inserendo ripetutamente tuple di chiavi e valori nella cache.Le classi chiave e valori sono molto semplici:

Chiave:

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

Valore:

public class Value implements Serializable{

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

Quando si inseriscono 100000 oggetti, il risultato in memoria è esattamente quello che mi aspettavo, Ehcache ha utilizzato 13396 byte per memorizzare gli oggetti mentre JBoss ha utilizzato 5712 byte per la stessa operazione (il che è positivo poiché lo stesso test utilizzava un ConcurrentHashMap utilizzato 5680 byte).

Tuttavia guardando i tempi di esecuzione ho avuto una bruttissima sorpresa:Ehcache ha impiegato 300 millisecondi per eseguire il mio test mentre JBossCache ha impiegato 44 secondi per fare lo stesso.Sono abbastanza sicuro che ci sia qualcosa di marcio nella mia configurazione JBoss che spiega questa differenza.

Ehcache viene inizializzato a livello di codice in questo modo:

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

La cache JBoss viene creata utilizzando Spring con la seguente configurazione del bean:

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

e il seguente jbossCacheConf.xml file:

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

Per completezza il test Ehcache è:

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

Mentre quello di JBoss è:

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

C'è qualcosa di sbagliato nel mio setup/benchmark?

È stato utile?

Soluzione

Sono passato a infinito e allora non ho strani problemi di prestazioni.

Altri suggerimenti

Fai attenzione alla configurazione predefinita di JBossCache.Potrebbe essere possibile che per impostazione predefinita JBossCache provi a trovare e replicare i dati su un nodo slave.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top