日期:2014-05-16  浏览次数:20529 次

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。
请指教……