0 0

hibernate session 及时更新问题5

第一次提问,希望有人能帮忙解答.
有一个B/S系统用hibernate做.有一个session A只做查询操作,另一个session B做插入操作.如果我先在session A中查询一系统对象.为了下次查询速度更快,我不做session A的清理.然后session B中新增几条记录,那么session A中如果查询出由session B新增的几条记录呢?
2008年6月17日 15:51

1个答案 按时间排序 按投票排序

0 0

采纳的答案

Hibernate中的缓存分两种:一级缓存(Session级别)和二级缓存(SessionFactory级别)

这里说一下一级缓存的用法。

每一个Session实例都可以看作一个容器,无论何时,当给save(),update()等方法传递一个对象时,或用load(),get()等方法获得一个对象时,该对象都将被加入到Session的内部缓存中。每一个持久化的对象,都必然位于Session缓存中,这个缓存里存放着当前Session范围内的持久对象,当应用程序需要使用对象的时候,就会先从当前的Session缓存中获取对象,如果获取不到,再直接发送SQL语句到数据库中查询,将记录的字段值组装成对象后放到Session中,以供应用程序调用。

其实简单总结一下其实Session的作用就是:在数据库和应用程序之前充当一个中间容器,减少程序访问数据库的次数。很多对象数据不是经常改变的,第一次访问这个对象时,Hibernate就将这个对象放到Session里面,以后只要这个对象没有改动过,应用程序再访问这个对象时,Hibernate就不会去数据库中查找它的数据,而是从内存中直接返回应用程序,这样做当然效率要比没有Session高得多。


于是,在这里有一个问题:如果应用程序访问一个对象,并对这个对象的数据进行操作改变了它的某些字段值,而这个操作必然是提交到了数据库的,但是缓存内的数据却仍然是未改变之前的那些数据,那么下次应用程序访问这个对象的时候岂不就得到的是缓存内的错误数据而非数据库中的真实数据?


这里就涉及到了一个清理缓存的概念,清理缓存是指查看缓存中的数据与数据库是否同步,如果缓存数据与数据库不一样,则发送更新语句把缓存数据与数据库同步;如果一样,则不操作。也就是说,只需要在适当的时候调用session.flush()清理一下缓存就可以了。什么才是适当的时候呢,在一个session中,有两个不同的清理点,如下代码片段:

..............//打开session,开启事务
//code segment1
//code segment2
//清理点1:这里经常是在查询语句之前改变了对象的属性值(AUTO,ALWAYS)
//code segment3
//清理点2:提交事务的时候调用flush()清理缓存(COMMIT)
........//提交事务,关闭session


其实在一个事务中,对数据进行操作使其改变了值,这种变换不会立即提交到数据库。因为有可能一个对象的某个属性发生了好几次变化(如某用户连续改了好几次自己的密码),在这样的情况下,Hibernate能把一些数据改变作一下结合,并对数据库进行最小数量的请求,它只向数据库发送一条update语句就可以把这些数据变化都包括了,当然这些都归功于session的缓存。(说到这里我就顺便发一句牢骚,特讨Hibernate生成的那一堆又臭又长的SQL语句,虽然每次我都设置的show_sql,但我极少去看那些SQL语句。)


PS:
上面代码片段里的AUTO,ALWAYS,COMMIT是flush模式,这里先不写吧,下次写了。太晚了,还是睡觉去咯,其实觉得学习最重要的还是要理清楚概念,今天我看这个session就是因为以前学hibernate的时候没有把各种概念搞得很清楚,以至于现在回头去补习相关概念........哭~~~~~

2008年6月17日 17:23

相关推荐

    Hibernate中大量数据的更新

    在批量更新时,如果不及时清除一级缓存,可能会导致内存溢出异常。因此,在批量更新时,需要定期调用 `session.flush()` 和 `session.clear()` 来清除一级缓存。 批量抓取 Hibernate 的批量抓取机制允许将多个...

    hibernate的核心接口--Session

    - **缓存的同步更新**: 当 Session 清理缓存时,Hibernate 会检查缓存中的对象状态是否发生变化,并同步更新数据库,从而确保数据一致性。 - **缓存相关方法**: - **`flush()`**: 刷新缓存并执行必要的 SQL 语句,...

    hibernate2 升级为hibernate3的需要注意的事项

    ### Hibernate2 升级至 Hibernate3 的注意事项 #### 背景与目的 随着技术的发展,软件框架也...此外,在升级过程中可能会遇到各种预期之外的问题,建议在遇到具体错误时,参考官方文档或社区资源,以便及时解决问题。

    Hibernate的事务处理机制和flush方法的用法.docx

    在默认情况下,Hibernate会在事务提交前自动调用`flush`,但有时我们需要手动调用它以确保数据及时写入数据库。然而,过度使用`flush`可能会导致事务的完整性受损,因为它可能在不适当的时间点更新数据,从而引发...

    hibernate和MySQL的jar

    6. **持久化操作**: 使用Hibernate进行CRUD(创建、读取、更新、删除)操作时,我们可以通过`save()`、`get()`、`update()`、`delete()`等方法,以及`Criteria`、`HQL`(Hibernate查询语言)或JPQL(Java ...

    hibernate一级缓存

    1. **对象持久化过程**:当我们在Session中进行对象的保存、更新或加载时,Hibernate会将这些对象放入一级缓存中。这个缓存就像是一个内存中的数据库,存储了当前Session所处理的对象状态。 2. **缓存与数据库的...

    新Hibernate SessionFactory().getCurrentSession()猫腻

    而Session接口则是与数据库交互的主要接口,用于执行SQL查询、保存或更新实体等操作。在传统的Hibernate使用模式中,开发者通常会在每个事务开始时创建一个新的Session,并在事务结束时关闭它。然而,`...

    spring和hibernate源文件

    2. **Session 和 Transaction**:Hibernate 的 Session 接口是与数据库交互的主要接口,而 Transaction 管理数据库操作的原子性。 3. **Criteria 和 HQL 查询**:除了 SQL,Hibernate 还提供了 Criteria API 和 HQL...

    hibernate5.1二级缓存包

    4. **缓存策略**:可以配置缓存更新策略,比如定时刷新、脏数据检测等,以确保缓存中的数据及时更新。 5. **查询缓存**:除了对象级别的缓存,还可以配置查询缓存,将 SQL 查询结果缓存起来,减少对数据库的访问。...

    Hibernate2和Hibernate3连接池配置.doc

    《Hibernate2与Hibernate3连接池配置详解》 在Java的持久层框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它允许开发者...同时,保持对官方文档和最佳实践的关注,及时更新配置,以确保系统的高效运行。

    HIBERNATE4开发文档,HIBERNATE4的变化

    在Hibernate4的开发中,相较于之前的版本,存在一些显著的变化,这些变化主要集中在...在遇到问题时,及时查找相关文档和资源,通常都能找到解决方案。对于开发人员来说,了解并适应这些变化是确保项目顺利进行的关键。

    Hibernate缓存,性能优化

    - **异步更新策略**:采用异步更新机制,将频繁更新的数据操作排队处理,避免实时更新对性能的影响,同时确保数据的最终一致性。 #### 监控和调优 - **性能监控工具**:利用JProfiler、VisualVM等工具,定期分析...

    Hibernate 面试题

    4. **使用Hibernate session**:在操作数据时,需先调用`open()`打开Session,完成后及时调用`close()`关闭Session,以释放资源并让连接池回收连接。 5. **Integer与int映射的差异**:使用Integer作为映射类型,...

    Android应用源码Hibernate4Android.zip

    3. 资源管理:正确管理Session和Transaction,确保在完成操作后及时关闭,防止资源泄露。 总结,Hibernate4Android为Android开发带来了一种新的数据库操作方式,它简化了对象与数据库之间的交互,使得开发者可以...

    Hibernate 二级缓存 总结整理

    4. **缓存清理与更新**:定期清理过期或不再使用的缓存,同时关注数据库的变更,及时更新缓存。 通过理解和运用Hibernate的二级缓存,我们可以优化应用性能,减少数据库压力,但同时也需要注意缓存可能带来的问题,...

    hibernate 3.0 dtd

    同时,DTD也提供了验证功能,当XML文件不符合DTD定义时,XML解析器会抛出错误,帮助开发者及时发现并修复问题。 在实际开发中,一个典型的Hibernate应用会包含一个`hibernate.cfg.xml`配置文件,引用`hibernate-...

    Hibernate

    - **定期flush和clear**:在循环插入过程中,每达到一定数量(如每20条记录),调用`session.flush()`和`session.clear()`方法,强制Hibernate将当前事务中的变更同步至数据库,并清空session缓存,避免内存占用过高...

    Hibernate所需的整合jar包

    【标题】:“Hibernate所需的整合jar包” 【描述】中提到的“这是一套Hibernate的jar资源整合包”,暗示了这个压缩包包含了一系列用于...此外,及时更新这些jar包至最新版本,也是确保项目安全性和性能的关键步骤。

    配置Hibernate使用Proxool连接池

    在Java的Web开发中,数据库连接管理是一个至关重要的环节,特别是在处理高并发场景时,合理的数据库连接池配置能显著提高系统性能。本篇文章将详细讲解...同时,注意定期监控连接池的状态,以便及时发现和解决问题。

    Hibernate的缓存策略

    - **监控与调试**:通过对缓存的监控,可以及时发现潜在的问题并进行优化调整。例如,监控缓存命中率可以帮助评估缓存的有效性。 #### 七、总结 缓存是提高应用系统性能的关键技术之一。在Hibernate框架中,一级...

Global site tag (gtag.js) - Google Analytics