记录直接从数据库中获取,而不是从缓存文件中获取

时间:2014-06-30 07:40:51

标签: java spring hibernate caching

我正在用spring,hibernate和dojo做一个项目。最初,使用spring-hibernate从数据库中获取记录需要更多的时间。所以在googling之后我发现“二级缓存将有助于更快地获取数据,因为我将记录保存在一些文件“。所以,我开始实现它。

但是每当我执行查询时,它都会直接命中数据库而不会从缓存文件中获取任何记录。

请帮帮我......

enchache.xml:

<?xml version="1.0"?>
<ehcache>
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="500" />
 <cache name="com.tcs.domain.User" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="5" timeToLiveSeconds="500" />
</ehcache>

dispatcher-servlet.xml:

<property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
        <prop key="hibernate.cache.use_second_level_cache">true</prop>
        <prop key="hibernate.cache.use_query_cache">true</prop>
        <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
        <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
    </props>
</property>

User.java:

@Entity
@Table(name = "sriram_demouser")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)  
public class User { 

............

}

这是我的DAO实施:

@Override  
@Transactional  
public List<User> getUserpagination(int page) {  

Date date= new Date();
System.out.println("Time before executing Query : "+new Timestamp(date.getTime()));

    @SuppressWarnings("unchecked")  
  // List<User> userlist = sessionfactory.getCurrentSession().createCriteria(User.class).setMaxResults(limitResultsPerPage).setFirstResult(page*limitResultsPerPage).list();  

List<User> userlist = sessionfactory.getCurrentSession().createQuery("from User where firstName like('xyz')").setMaxResults(limitResultsPerPage).setFirstResult(((page-1)*limitResultsPerPage)).list();

  System.out.println("Time After executing Query : "+new Timestamp(date.getTime()));   


    return userlist;  

} 

两者都打印几乎同一时间。我想知道这个休眠所花费的时间是多少。它需要花费大约10秒来显示500条记录(即使是来自缓存文件也是如此)

1 个答案:

答案 0 :(得分:0)

在您的示例中,您在查询中“firstName喜欢'xzy'”但是为了点击查询缓存,执行的查询必须完全相同,参数完全相同。

如果执行“firstName like'John'”,第一次(假设'hibernate.cache.use_query_cache为true'并且此实体被标记为cachable),结果将进入二级缓存中的查询缓存,并且如果您使用相同的参数执行此完全相同的查询,则后续时间将从缓存中返回结果。

此外,如果您按ID检索任何项目,也会从缓存中返回这些项目(假设它们已被缓存)