2011-07-17 20 views
6

Tengo el siguiente problema: Tengo una consulta que me volver 35 resultados y me gustaría tener en caché de segundo nivel:Ehcache + hibernación

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

Mi objetivo es el siguiente:

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

//all setters and getters ommited: 

} 

mi archivo ehcache.xml está en/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> 

y mi configuración de Hibernate es:

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

Mi problema es el siguiente: cuando se lleva la página para la primera vez que veo el selecto que reúne todos los 35 resultados:

cuando actualización de la página, en lugar de llevar 35 objetos de la memoria caché que veo 35 Seleccionar declaraciones que consulta objetos por id uno por uno.

¿Qué pasa?

Respuesta

5

Me estaba pasando cuando la consulta estaba en la memoria caché pero los objetos no. En su código de ejemplo, veo que la consulta se refiere a com.ewave.upromotions.objects.Product pero tiene una región de caché definida para com.vanilla.objects.Product. Y no proporcionó ninguna región de caché a la clase Product. Por lo tanto, le sugiero que especifique explícitamente la región de la memoria caché para Product y la defina en la configuración de la memoria caché. Para comenzar, probaría la misma región para consultas y objetos, solo para ver si funciona, y luego probar configuraciones separadas.