2011-07-17 5 views
6

J'ai le problème suivant: J'ai une requête qui me retourner 35 résultats et je voudrais garder en mémoire cache de second niveau:ehcache + mise en veille prolongée

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

Mon objet est le suivant:

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

//all setters and getters ommited: 

} 

mon fichier ehcache.xml est dans/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> 

et ma configuration Hibernate est:

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

Mon problème est le suivant: lors de la mise page pour la première fois que je vois la sélection qui amène les 35 résultats:

quand je rafraichir la page, au lieu d'apporter 35 objets du cache que je vois 35 sélectionnez les instructions qui interrogent les objets par identifiant un par un.

Qu'est-ce qui ne va pas?

Répondre

5

Cela m'arrivait lorsque la requête était mise en cache mais que les objets ne l'étaient pas. Dans votre exemple de code, je vois que la requête fait référence à com.ewave.upromotions.objects.Product mais que vous avez défini la région de cache pour com.vanilla.objects.Product. Et vous n'avez fourni aucune région de cache à la classe Product. Je vous suggère donc de spécifier explicitement la région du cache pour Product et de la définir dans la configuration du cache. Pour commencer, je voudrais essayer la même région pour la requête et l'objet, juste pour voir si cela fonctionne, puis essayez des configurations séparées.

Questions connexes