Hibernate 使用缓存时,数据同步有关问题--Java学习网

时间:2015-12-5 10:03:12

  核心提示:Hibernate 使用缓存时,数据同步问题。教一下hibernate缓存如何同数据库保持同步时间:2008-07-23 12:34:40 来源:论坛整理 作者: 编辑:chinaitzhe当数据库记...
Hibernate 使用缓存时,数据同步问题。 


教一下hibernate缓存如何同数据库保持同步时间:2008-07-23 12:34:40   来源:论坛整理  作者:  编辑:chinaitzhe当数据库记录由外部发生改变时,一级缓存session如何和数据库保持同步,而二级缓存又如何同数据库保持同步

 友回复:当你调用COMMIT()的时候,就会刷新缓存。
网友回复:你可以以用refresh来刷新,你的缓存
网友回复:不懂 学习
网友回复:Session s = HibernateStore.getSession(); 
s.flush(); //强制同步
网友回复:所谓一级缓存,就是指Session对像中有持久对像的快照,当这个对像在外部发生成变化,在调用过SaveOrUpdate方法后,并不马上执行更新,而是在Session关闭时检查属性假如和快照中不一致,就去更新数据库,在配置文件中还可以指定假如属性发生变化才更新,也可以说是只更新发生变化了的属性。这样做可以提高效率。
网友回复:http://blog.csdn.net/caoyinghui1986/archive/2008/04/20/2308993.aspx


假如查询需要强行刷新其查询缓存区域,那么你应该调用Query.setCacheMode(CacheMode.REFRESH)方法。 这对在其他进程中修改底层数据(例如,不通过Hibernate修改数据),或对那些需要选择性更新特定查询结果集的情况非凡有用。 这是对SessionFactory.evictQueries()的更为有效的替代方案,同样可以清除查询缓存区域。

也就是这样,在前面加上 s.setCacheMode(CacheMode.REFRESH);

我用s.setCacheMode(CacheMode.REFRESH);  成功,其它没试.

 

众所周知,hibernate是采取二级缓存的策略,第一是session级别的缓存,二是sessionfactory级别的缓存,并且默认二级缓存是打开的。读取数据的时候,Hibernate将第一次读取的内容放到了缓存中,若此时有别的应用修改了数据库中的数据,程序再次读取的时候,内容是从缓存中直接获取,先从一级缓存中读,若没有则从二级缓存中读取,则读取的数据为过时的数据。

   我遇到的是分页数据的读取,因为有个后台程序在定时更新作业状态数据,故在缓存打开的情况下刷新页面,不仅得不到应有的正确数据,

不断刷新时还会出现很多奇怪的现象,比如状态数据的不断改变和时隐时现,当时搞得很恼火,静心读了hibernate的缓存策略后,采取的应对措施为:

           1.session.clear(),先清除一级缓存

           2.createSQLQuery创建的SQLQuery对象query中设置query.setCacheMode(CacheMode.IGNORE);

           设置成CacheMode.IGNORE模式,在读取数据的时候,不和二级缓存交换数据,直接读取数据库。

则页面刷新皆为正常显示,因为分页每页显示的数据顶多也就10几20几条,故不读缓存对性能影响不大,可放心使用

1 楼 tongyiwzh 2010-11-03  
我也遇到类似的问题,后来我用2.5版本的hibernate,还是没有解决问题,我尝试过你说的那种方法,但是还是不行,能交流一下 吗?
2 楼 tianzhihehe 2011-01-31  
异想天开: 
我有两个应用,A跟B,都使用了hibernate包。能不能通过强制不使用hibernate的缓存机制,直接通过hibernateCRUD数据库呢? 
这样就不会有LZ提及的问题了,同时这个方案比JDBC要那么“面向对象”一点点,利用了hibernate把数据库返回来的resultset包装成容易操作的OBJECT。 

Java免费学习   Java自学网 http://www.javalearns.com

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

作者:不详 来源:网络
    你是从哪里知道本网站的?
  • 网友介绍的
  • 百度搜索的
  • Google搜索的
  • 其它搜索过来的
  • 网址输错了进来的
  • 太忙了不记得了
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • java学习网(www.javalearns.com) © 2014 版权所有 All Rights Reserved.
  • Email:javalearns@163.com 站长QQ:1356121699 晋ICP备14003680号-3
  • java学习网部分内容来自网络或网友发布,如侵犯了您利益,请发邮件至:javalearns@126.com,我们尽快处理!
  • Java学习网
  • 网站统计
  • 晋公网安备 14042902000001号