0

我将我的应用程序配置为使用查询缓存。

休眠配置:

hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
hibernate.cache.use_query_cache=true

EHCache 配置:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false" monitoring="autodetect" dynamicConfig="false">
    <defaultCache
        maxEntriesLocalHeap="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        maxEntriesLocalDisk="10000000"
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
    <cache name="query.Dictionary.CountriesList"
        maxEntriesLocalHeap="10000" 
        maxEntriesLocalDisk="1000"
        eternal="false"
        timeToLiveSeconds="86400">
        <persistence strategy="localTempSwap" />
    </cache>
</ehcache>

道:

Criteria query = session.createCriteria(DictionaryCountry.class)
                .setCacheable(true)
                .setCacheRegion("query.Dictionary.CountriesList")
                .addOrder(Order.asc("name"));

现在,当我第一次尝试填充国家/地区列表时 - 进行了标准查询(select * from ... where ... )。但是当我第二次这样做时 - 应用程序不是从缓存中获取,而是通过 id sql 查询执行了很多获取(select * from ... where id = ? )......

这是正常行为吗?

谢谢

4

2 回答 2

1

很长一段时间后,但今天我遇到了同样的问题,如果有人需要 ehcache+spring+hibernate 的帮助,这里是一个答案

以前的配置是正确的,我只会添加下一个:

1.- 添加:<property name="hibernate.cache.use_second_level_cache">true</property>

2.- 在您的模型中设置

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE )

3.- 添加类似这样的内容以使您的模型可缓存

<cache name="com.yourcompany.yourproyect.model.DictionaryCountry
    maxEntriesLocalHeap="10000" 
    maxEntriesLocalDisk="1000"
    eternal="false"
    timeToLiveSeconds="86400">
    <persistence strategy="localTempSwap" />
</cache>

query.setCacheable(true);必需使您的模型可缓存 query.setCacheRegion("query.Dictionary.CountriesList");为可选,因为使您的模型可在查询级别缓存

ehcache 版本:

<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache-core</artifactId>
  <version>2.4.5</version>
</dependency>

我认为就是这样,因为这对我有用。

于 2014-01-09T16:25:11.403 回答
0

是的,查询缓存需要二级缓存。这是我的配置:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property><code>
<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</property>
<property name="hibernate.cache.use_structured_entries">true</property>
<property name="hibernate.generate_statistics">true</property>

关于对数据库的多个查询问题,我发现的真正错误在这里

var1 = 1 和 var2 = 20。

List<entity> objects = session.createCriteria(entity.class)  
                              .add(Restrictions.between("price",var1,var2))
                              .setCacheable(true)
                              .list();

问题是:如果我执行后续查询,ehcache 不够智能,无法从缓存中检索,var1 = 21因为var2 = 40这些对象已经从上一个查询中缓存。

我在一个查询中遇到了动态参数的问题,因此二级缓存从未被命中,因为查询总是不同的,它需要具有相同的参数。

希望它有所帮助,因为这是我的经验。

于 2014-01-17T21:41:08.677 回答