我正在用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条记录(即使是来自缓存文件也是如此)
答案 0 :(得分:0)
在您的示例中,您在查询中“firstName喜欢'xzy'”但是为了点击查询缓存,执行的查询必须完全相同,参数完全相同。
如果执行“firstName like'John'”,第一次(假设'hibernate.cache.use_query_cache为true'并且此实体被标记为cachable),结果将进入二级缓存中的查询缓存,并且如果您使用相同的参数执行此完全相同的查询,则后续时间将从缓存中返回结果。
此外,如果您按ID检索任何项目,也会从缓存中返回这些项目(假设它们已被缓存)