2011-07-17 16 views
6

Mam następujący problem: Mam kwerendy, która zwraca mi 35 wyników i chciałbym zachować w drugiej pamięci podręcznej poziomu:ehcache + hibernacji

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

Moim celem jest następująca:

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

//all setters and getters ommited: 

} 

mój plik ehcache.xml jest w/src/katalogu:

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

i mojej konfiguracji hibernacji jest:

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

Mój problem jest następujący: przy wprowadzaniu aktualizacja raz pierwszy widzę select, która łączy wszystkie 35 wyników:

gdy odświeżam stronę, zamiast przynosić 35 obiektów z cache widzę 35 select instrukcje, które kwerendy obiektów według id jeden po drugim.

Co jest nie tak?

Odpowiedz

5

To działo się ze mną, gdy zapytanie zostało zbuforowane, ale obiekty nie były. W twoim przykładowym kodzie widzę, że zapytanie odnosi się do com.ewave.upromotions.objects.Product, ale masz obszar pamięci podręcznej zdefiniowany dla com.vanilla.objects.Product. I nie zapewniono żadnego regionu pamięci podręcznej dla klasy Product. Sugeruję więc jawne określenie regionu pamięci podręcznej dla Product i zdefiniowanie go w konfiguracji pamięci podręcznej. Aby rozpocząć, spróbowałbym tego samego regionu dla zapytania i obiektu, aby sprawdzić, czy to działa, a następnie spróbuj osobnych konfiguracji.