关于hibernate查询缓存的问题
答案:2 悬赏:50
解决时间 2021-03-13 09:04
- 提问者网友:刀枪不入
- 2021-03-12 08:22
工程是MVC结构的,用hibernate修改数据之后,页面显示查询结果,反复刷新页面,查询的数据一会儿是修改之前的,一会儿是修改之后的(每个查询query也写了setCacheable(false))。即使是使用SQLQuery查询依然如此,请问有什么比较好的解决办法?
查询代码:
public List querystatus(){
List list=new ArrayList();
Session session=HibernateSessionFactory.getSession();
session.clear();
Query query=session.createQuery("from Stage where status=1").setCacheable(false);
list=query.list();
session.flush();
return list;
}
修改代码:
public void saveStage1(String stageno)
{
Session session=HibernateSessionFactory.getSession();
session.clear();
session.beginTransaction();
Stage stage=(Stage)session.get(Stage.class, new String(stageno));
stage.setStatus(1);
session.saveOrUpdate(stage);
session.getTransaction().commit();
}
最佳答案
- 二级知识专家网友:24K纯糖
- 2021-03-12 08:35
一级缓存:查询过的对象都会放在一个与Session对象相关的容器中 再次查询时会检查容器中有没有 如果没有才会去数据库中查 来提高查询速度
二级缓存:与SessionFactory相关的容器来缓存对象SessionFactory在整个应用程序中只存在一个,程序启动时创建,关闭时销毁
全部回答
- 1楼网友:两不相欠
- 2021-03-12 09:44
查询缓存,就是在内存建立空间用来保存上次查询结果,下次再进行同样的查询时,就不用再从数据库查找结果,大大的提高速度。
不过内存和数据库的数据没有完全同步,所以不适用于多个程序共同访问同一数据表的的情况;这样的话,数据表的数据已经被其他程序修改,有可能内存里存在的数据是旧数据,这就是所谓的脏数据。
而且hibernate和数据库的查询缓存,在对一个数据表记录进行修改时,会把有关这个表的全部查询缓存清空,以保证减少脏读问题。
所以查询缓存只适用于非多服务器同时访问的数据库,而且读取大大多于修改操作的数据表上
我要举报
大家都在看
推荐资讯