日期:2014-05-16 浏览次数:20549 次
教一下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几条,故不读缓存对性能影响不大,可放心使用