4

我有这个 spring/hibernate 项目,我正在尝试通过 ehcache 和 terracotta 将二级缓存添加到休眠。一切似乎都很好,我什至可以在兵马俑控制台中看到我试图缓存的实体的条目。但是根据数据库中的统计数据和日志,根本没有缓存任何东西!

负载命中率为0%,负载统计也为0。我做错了什么?

这是我所做的,我通过 maven 添加了所需的 jars。

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

更改了我的休眠属性以启用二级缓存

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

将 @Cache 注释添加到我的测试实体

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

这是我非常简单的 ehcache.xml (我还尝试为我的实体设置缓存条目,结果相同)

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

在我启动我的兵马俑服务器并运行我的测试代码之后

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

我的日志显示了 100 个不应该发生的 SQL。它还显示命中率为 0%。

这是我的测试运行时来自兵马俑控制台的一些屏幕截图。

为了让它工作,我需要的最后一块是什么?

二级缓存统计 ehcache 概述 实体统计

4

1 回答 1

3

找到了我正在试验的问题的解决方案,以下是详细信息:

  • 由于休眠属性中的键错误,未设置统计信息

使用这个(注意没有.cache。

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

代替

<prop key="hibernate.cache.generate_statistics">true</prop>
  • 查询没有被缓存,因为我没有将“.setCachable(true)”用于负责列出/加载实体的方法。
于 2012-05-16T12:58:48.113 回答