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?