4 Stimmen

hibernate 2nd level cache via ehcache mit Terracotta - Caching überhaupt nicht möglich?

Ich habe dieses Spring/Hibernate-Projekt, das ich versuche, 2nd Level Cache zu Hibernate über ehcache und Terracotta hinzuzufügen. Alles scheint gut zu funktionieren, ich kann sogar in der Terracota-Konsole die Einträge für die Entitäten sehen, die ich zu cachen versuche. Aber basierend auf den Statistiken und dem Log der DB wird überhaupt nichts gecached!

Die Lasttrefferquote beträgt 0 %, die Laststatistik ist ebenfalls 0. Was ist das, was ich falsch mache?

Hier ist, was ich tat, ich fügte die erforderlichen Jars über Maven.

        <dependency>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache-core</artifactId>
                <version>2.5.2</version>
        </dependency>
        <dependency>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache-terracotta</artifactId>
                <version>2.5.2</version>
        </dependency>
        <dependency>
                <groupId>org.terracotta</groupId>
                <artifactId>terracotta-toolkit-1.5-runtime</artifactId>
                <version>4.2.0</version>
        </dependency>

Ich habe meine Hibernate-Eigenschaften geändert, um den Cache der zweiten Ebene zu aktivieren.

<property name="hibernateProperties">
            <props>
                ...
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
                <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.cache.use_structured_entries">true</prop>
                <prop key="hibernate.cache.generate_statistics">true</prop>
            </props>
        </property>

Hinzufügen der @Cache-Anmerkung zu meiner Testentität

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User implements java.io.Serializable
 {
...
}

Hier ist meine extrem einfache ehcache.xml (ich habe auch versucht, einen Cache-Eintrag für meine Entität zu setzen, mit dem gleichen Ergebnis)

<?xml version="1.0" encoding="UTF-8"?>
<ehcache >    
    <defaultCache  
        maxElementsInMemory="10000"   
        eternal="false" 
        maxEntriesLocalHeap="10"         
        timeToIdleSeconds="120"         
        timeToLiveSeconds="120">        
        <terracotta/>    
    </defaultCache>        
    <terracottaConfig         
        url="localhost:9510"/>
</ehcache>

Und nachdem ich meinen Terracotta-Server gestartet und meinen Testcode ausgeführt habe

@Test
    @Transactional
    @Rollback(false)
    public void testCache() {
        long start = System.currentTimeMillis();
        List<User> list = userRepository.listAll(0, 100);
        long end = System.currentTimeMillis();
        log.info("Total time "+(end-start));
        assertNotNull(list);
        assertThat(list.size(), is(100));

        for (int i=0; i<100; i++) {
            long start2 = System.currentTimeMillis();
            list = userRepository.listAll(0, 100);
            long end2 = System.currentTimeMillis();
            log.info("Total time 2 "+(end2-start2));
        }
        assertNotNull(list);
        assertThat(list.size(), is(100));
    }

Mein Protokoll zeigt 100 SQL an, die nicht auftreten sollten. Es zeigt auch eine Trefferquote von 0 %.

Hier sind einige Screenshots von der Terracotta-Konsole, während mein Test läuft.

Was ist das letzte Stück, das ich brauche, damit es funktioniert?

2nd level cache statistics ehcache overview Entity statistics

3voto

maverick Punkte 1987

Ich habe die Lösung für die Probleme gefunden, mit denen ich experimentiert habe, hier sind die Details:

  • Die Statistiken wurden aufgrund eines falschen Schlüssels in den Hibernate-Eigenschaften nicht gesetzt

Verwenden Sie dies (beachten Sie keine .cache. )

<prop key="hibernate.generate_statistics">true</prop>

anstelle von

<prop key="hibernate.cache.generate_statistics">true</prop>
  • Die Abfragen wurden nicht zwischengespeichert, da ich nicht ".setCachable(true)" für die Methode verwendete, die für das Auflisten/Laden der Entitäten zuständig war.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X