Pregunta

Estoy considerando utilizar para implementar una caché de cualquiera de JBoss Cache o Ehcache.Después de mirar a ambos Api I tiene la intuición de que JBoss es probablemente un poco más de memoria eficiente que Ehcache ya que se puede poner raw los objetos en la memoria caché mientras Ehcache necesidades para envolver los datos en un Element objeto.

Puedo configurar una rápida banco de insertar repetidamente la tecla, el valor de tuplas en la caché.La clave y valores de las clases son muy simples:

Clave:

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

Valor:

public class Value implements Serializable{

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

Cuando la inserción de 100000 objetos de resultado en la memoria donde se exactamente lo que yo esperaba, Ehcache utilizado 13396 bytes para almacenar los objetos mientras JBoss utilizado 5712 bytes para la misma operación (lo cual es bueno ya que la misma prueba utilizando un ConcurrentHashMap utiliza 5680 bytes).

Sin embargo, cuando me miró a los tiempos de ejecución, tuve una muy mala sorpresa:tomó Ehcache 300 milisegundos para realizar mi prueba, mientras que los tomó de 44 segundos para JBossCache a hacer lo mismo.Estoy bastante seguro de que hay algo podrido en mi configuración de JBoss para explicar esta diferencia.

Ehcache se inicializa mediante programación como este:

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 es creado usando la Primavera con los siguientes bean de configuración:

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

y el siguiente jbossCacheConf.xml archivo:

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

En aras de la exhaustividad de la Ehcache de prueba es:

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

Mientras que el JBoss es:

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

Nada malo en mi configuración/punto de referencia?

¿Fue útil?

Solución

Cambié a infinispano Y no tengo ningún problema de rendimiento extraño entonces.

Otros consejos

Tenga cuidado con la configuración predeterminada de JBossCache. Podría ser posible que, por defecto, JBossCache intente encontrar y replicar datos en un nodo esclavo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top