2011-07-17 77 views
6

我有以下問題: 我有一個查詢這回我35分的結果,我想繼續在二級緩存:的Ehcache + hibernate的

public List<Product> getAllProducts() { 
     Session session = this.sessionfactory.getCurrentSession(); 
     String queryString = "from com.ewave.upromotions.objects.Product product where product.active=:active"; 
     Query query = session.createQuery(queryString); 
     query.setBoolean("active", true); 
     query.setCacheable(true); 
     query.setCacheRegion("productCache"); 
     List<Product> products =query.list(); 
     return products; 
    } 

我的目標如下:

@Entity 
@Table(name="products",schema="test11") 
@Cacheable 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class Product implements Serializable { 

//all setters and getters ommited: 

} 

我ehcache.xml中文件在/ src /目錄:

<ehcache> 
    <diskStore path="java.io.tmpdir"/> 
    <defaultCache maxElementsInMemory="10000" 
     eternal="false" 
     timeToIdleSeconds="120" 
     timeToLiveSeconds="120" 
     overflowToDisk="false"/> 
    <cache name="hibernate.test.org.hibernate.cache.UpdateTimestampsCache" 
     maxElementsInMemory="10000" 
     eternal="false" 
     timeToIdleSeconds="120" 
     timeToLiveSeconds="120" 
     overflowToDisk="true"/> 
    <cache name="hibernate.test.org.hibernate.cache.StandardQueryCache" 
     maxElementsInMemory="10000" 
     eternal="false" 
     timeToIdleSeconds="120" 
     timeToLiveSeconds="120" 
     overflowToDisk="true"/> 
    <cache name="com.vanilla.objects.Product" 
     maxElementsInMemory="300" 
     eternal="false" 
     overflowToDisk="false" 
     timeToIdleSeconds="600" 
     timeToLiveSeconds="600" 
     /> 
     <cache name="productCache" 
     maxElementsInMemory="100" 
     eternal="true" 
     overflowToDisk="false" /> 

</ehcache> 

和我的Hibernate配置是:

<props> 
    <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> 
    <prop key="hibernate.cache.use_second_level_cache">true</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    <prop key="hibernate.cache.use_query_cache">true</prop> 
    <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop> 
    <prop key="hibernate.connection.release_mode">after_transaction</prop> 
    <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop> 
    </props> 

我的問題是這樣的:把頁第一次當我看到選擇帶來所有35個結果:

當我刷新頁面,而不是從高速緩存帶來35個物體我看到35選擇按ID逐個查詢對象的語句。

怎麼了?

回答

5

查詢被緩存但對象不存在時發生在我身上。在你的示例代碼中,我看到該查詢引用了com.ewave.upromotions.objects.Product,但是您有爲com.vanilla.objects.Product定義的緩存區域。並且您沒有向Product類提供任何緩存區域。所以我建議你爲Product明確指定緩存區域,並在緩存配置中對其進行定義。首先,我會嘗試查詢和對象的相同區域,只是爲了查看它是否有效,然後嘗試單獨的配置。

相關問題