Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EhCache+hibernate_Java_Spring_Hibernate_Ehcache_Second Level Cache - Fatal编程技术网

Java EhCache+hibernate

Java EhCache+hibernate,java,spring,hibernate,ehcache,second-level-cache,Java,Spring,Hibernate,Ehcache,Second Level Cache,我有以下问题: 我有一个查询,返回35个结果,我希望保留在二级缓存中: public List<Product> getAllProducts() { Session session = this.sessionfactory.getCurrentSession(); String queryString = "from com.ewave.upromotions.objects.Product product where product.active

我有以下问题: 我有一个查询,返回35个结果,我希望保留在二级缓存中:

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;
    }
我的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个select语句,它们逐个按id查询对象


怎么了

当查询被缓存但对象没有被缓存时,这种情况就发生在我身上。在您的示例代码中,我看到查询引用了com.ewave.upromotions.objects.Product,但您已经为com.vanilla.objects.Product定义了缓存区域。而且您没有为产品类提供任何缓存区域。所以我建议您显式地为产品指定缓存区域,并在缓存配置中定义它。首先,我会对查询和对象尝试相同的区域,只是看看它是否有效,然后尝试不同的配置

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