Ehcache似乎不起作用

时间:2015-12-30 09:58:15

标签: jpa memcached ehcache

现在我想通过ehache使用JPA二级缓存。我做了一些配置,似乎工作。但我仍然可以看到查询sql。我不确定ehcache是​​否有效。有人知道吗?感谢。

1.some part of persistence.xml
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" /> 
            <property name="hibernate.cache.provider_configuration" value="/ehcache.xml" />   
            <property name="hibernate.generate_statistics" value="true" />  
            <property name="hibernate.cache.use_second_level_cache" value="true" /> 
            <property name="hibernate.cache.use_query_cache" value="true" />
            <property name="hibernate.show_sql" value="true" />
2.ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <defaultCache maxElementsInMemory="1" eternal="false" 
           timeToIdleSeconds="1200" timeToLiveSeconds="1200" overflowToDisk="true" clearOnFlush="true">
    </defaultCache>

    <cache name="org.test.persistent.entity.Scenario" 
           maxElementsInMemory="10000"
           eternal="false"
           timeToIdleSeconds="1800"
           timeToLiveSeconds="3600"
           overflowToDisk="true">
    </cache>
    <cache name="org.hibernate.cache.spi.UpdateTimestampsCache" 
        maxElementsInMemory="10000"
        timeToIdleSeconds="1800"
        timeToLiveSeconds="3600"
        eternal="false">
    </cache>
</ehcache>
3. sql
TypedQuery<Scenario> query = em.createQuery(
                    "from Scenario as s where s.obsolete!=1 and s.parentId=? order by s.name, s.scenarioStatusId",
                    Scenario.class);
            query.setParameter(1, parentId);
            query.setHint("org.hibernate.cacheable", true);
            List<Scenario> scenarios = null;
            org.hibernate.Query hbQuery = null;
            if (query instanceof org.hibernate.ejb.QueryImpl) {
                hbQuery = ((org.hibernate.ejb.QueryImpl)query).getHibernateQuery();
                hbQuery.setCacheable(true);
                scenarios = hbQuery.list();
            } else {
                scenarios = query.getResultList();   
            }

2 个答案:

答案 0 :(得分:0)

Ehcache设置的默认值为maxElementsInMemory =&#34; 10000&#34;。它必须根据命中进行调整。

执行此操作的一种方法是,您可以增加maxElementsInMemory并检查是否要通过&#34;试用和错误&#34;来解决此问题。方法

其他方式(可靠)是您必须发布Mbeans并在JConsole中监视缓存使用和缓存未命中。根据报告,您可以增加&#39; maxElementsInMemory&#39;。请参考http://hibernate-jcons.sourceforge.net/usage.html

中的方法

答案 1 :(得分:-1)

我通过添加&#34;&#34;将缓存数据写入磁盘。它似乎运作良好,我在目录中找到一些数据。但我仍然没有找到为什么它仍然执行sql的原因。