gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:47:17 25 4
gpt4 key购买 nike

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

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

请帮帮我...

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>

调度程序-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>

用户.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;

}

两者几乎同时打印。我想知道这个 hibernate 在哪里花费更多时间。显示 500 条记录需要将近 10 秒(甚至来自缓存文件)

最佳答案

在您的示例中,您的查询中有“where firstName like 'xzy'”,但为了命中查询缓存,执行的查询必须相同,具有完全相同的参数。

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

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

关于java - 记录直接从数据库中获取,而不是从缓存文件中获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24485147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com