`

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几条,故不读缓存对性能影响不大,可放心使用

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

相关推荐

    Hibernate 使用缓存时,数据同步问题

    Hibernate 使用缓存时,数据同步问题

    hibernate 3中的缓存小结

    l OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。 l SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。...

    Hibernate的缓存机制

    缓存(Cache )是计算机领域非常通用的概念。它介于应用程序和永久性数据存储...缓存中的数据是数据存储源中数据的拷贝,应用程序在运行时直接读写缓存中的数据,只在某些特定时刻按照缓存中的数据来同步更新数据存储源。

    Java框架篇?hibernate之缓存机制

     缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。  二、what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:...

    hibernate缓存

    Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问...缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据.

    Ehcache分布式缓存与其在SpringBoot应用

    EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中...4)缓存数据有两级:内存和磁盘,因此无需担心容量问题 5)缓存数据会在虚拟机重启的过程中写入磁盘 6)可以通过 RMI、可插入 API

    hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别.docx

    2 session.clear()的作用就是清除session中的缓存数据(不管缓存与数据库的同步)。 3.session.refresh():会强制发送select语句,以使session缓存中对象的状态和数据表中对应的记录保持一致。该方法的有效性需要...

    hibernate 教程

    开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory配置 3.1. 可编程配置方式...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    Android数据库应用编程——为企业开发数据驱动Android应用

    Android数据库应用编程——为企业开发数据驱动Android应用 透彻讲述如何使用内容提供器共享数据、使用适配器显示数据以及使用Web服务传输数据,介绍集成应用程序和现有企业系统、保护数据以及同步数据的方法。...

    Spring整合Ecache

    4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题 5. 缓存数据会在虚拟机重启的过程中写入磁盘 6. 可以通过RMI、可插入API等方式进行分布式缓存 7. 具有缓存和缓存管理器的侦听接口 8. 支持多缓存管理器...

    hibernate的核心接口--Session

    Session是Hibernate中应用最频繁的接口,Session也被称为持久化管理器,它负责所有的持久化工作,负责管理持久化对象的生命周期,提供第一级别的高级缓存来保证持久化对象的数据与数据库同步

    hibernate

    开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory配置 3.1. 可编程配置方式...

    精通Hibernate:对象持久化技术第二版part3

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    Hibernate与数据库的触发器协同工作

    Hibernate 与数据库中的触发器协同工作时, 会造成两类问题  1、触发器使 Session 的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中, 它执行的操作对 Session 是透明的 Session 的  解决...

    HiberNate实体

    Hibernate会检测到处于持久化状态对象的改动,在当前操作完成时将对象数据写回数据库,开发者不用手动执行Update更新数据库, 这个时候内存中存在,数据库中也存在; 在修改持久状态的时候,不会去立即同步数据库,会先...

    基于 JavaEE 的快速开发框架 Tephra-JavaEE

    提供全冗余方式的缓存,自动在每个节点间同步缓存数据,而每个节点都仅从本地内存中获取缓存数据,从而提供高效的执行效率,并且当部分节点宕机时仍旧能正常提供服务。当然,也允许使用Redis提供统一的中心节点缓存...

    Spring.3.x企业应用开发实战(完整版).part2

    17.4.5 使用Hibernate二级缓存 17.5 对持久层进行测试 17.5.1 配置Unitils测试环境 17.5.2 准备测试数据库及测试数据 17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的...

    Spring3.x企业应用开发实战(完整版) part1

    17.4.5 使用Hibernate二级缓存 17.5 对持久层进行测试 17.5.1 配置Unitils测试环境 17.5.2 准备测试数据库及测试数据 17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的...

    从J2SE到J2EE知识点介绍

    3. 更新数据(源代码:hibernate_0300) 207 4. 加载数据(源代码:hibernate_0400) 208 5. 缓存 211 6. 对象映射配置 212 7. <hibernate-mapping>元素介绍 212 8. 元素介绍 212 9. 元素介绍 213 10. 元素介绍 214 ...

Global site tag (gtag.js) - Google Analytics