Frage

Ich überlege, ob ich einen Cache entweder JBoss Cache oder EHCache implementieren kann. Nachdem ich beide APIs angesehen habe, habe ich die Intuition, dass JBoss wahrscheinlich ein bisschen mehr speicherer ist als EHCache roh Objekte in den Cache, während EHCache die Daten in a einpacken muss Element Objekt.

Ich habe eine schnelle Bank eingerichtet, die wiederholt Schlüssel einfügt und Tupel im Cache bewertet. Die Schlüssel- und Werteklassen sind sehr einfach:

Taste:

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

Wert:

public class Value implements Serializable{

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

Beim Einsetzen von 100000 Objekten das Ergebnis im Speicher, in dem ich erwartet hatte, verwendete EHCACHE 13396 Bytes, um die Objekte zu speichern, während JBoss 5712 Bytes für denselben Vorgang verwendete (was seit dem gleichen Test mit einem gut gut ist ConcurrentHashMap gebraucht 5680 Bytes).

Als ich mir jedoch die Hinrichtungszeiten ansah, hatte ich eine sehr schlechte Überraschung: EHCACHE 300 Millisekunden dauerte, um meinen Test durchzuführen, während es 44 Sekunden dauerte, bis JBOSSCache dasselbe unternahm. Ich bin mir ziemlich sicher, dass in meiner JBoss -Konfiguration etwas verrottet ist und diesen Unterschied erklärt.

EHCache wird so programmgesteuert wie folgt initialisiert:

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 wird mit der Feder mit der folgenden Bean -Konfiguration erstellt:

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

und die folgende jbossCacheConf.xml Datei:

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

Für die Vollständigkeit ist der EHCACHE -Test:

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

Während der Jboss ist:

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

Etwas falsch in meinem Setup/Benchmark?

War es hilfreich?

Lösung

Ich wechselte zu Infinispan Und ich habe damals keine seltsamen Leistungsprobleme.

Andere Tipps

Seien Sie vorsichtig mit der Standard -JBOSSCache -Konfiguration. Es könnte möglich sein, dass JBOSSCache standardmäßig versucht, Daten auf einem Sklavenknoten zu finden und zu replizieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top