Session脏检查及清理缓存机制

  今天看hibernate书,看到“理解Session的缓存”这一张脏检查及清理缓存的机制后,突然明白程序中session并非一定要执行update()方法。没有执行update()方法,对象仍会与数据库进行数据交互。

  Session脏检查及清理缓存机制:

  Session缓存中对象的属性每次改变时,Session不会立即清理缓存及执行Update SQL,而是会在特定时间清理缓存(执行相应的sql),提交事务。

清理缓存时,会相应的改变对象的状态。

  Java对象在内存中有四个状态:临时状态(transient)、持久化状态(persistent)、游离状态(detached)、删除状态(removed)。

  Session做任何的操作,如果没有显示的调用commit()方法,都不会清理缓存、执行相应的SQL、提交事务。对象在Hibernate持久层中做不同的操作,会相应的改变其状态。如图上。

  Session会在特定的时间清理缓存。那么特定时间指的是什么时候呢?

  1) 当应用程序调用org.hibernate.Transaction的commit()方法时,commit()方法会先清理缓存,然后向数据库提交事务。先清缓存再提交事务,有两个好处,一可以减少访问数据库的频率,二可以缩短当前事务对数据库中相关资源的锁定时间。

  2) 当应用执行一些查询操作时。如缓存中持久化对象属性已改变,就会先清缓存,使得Session缓存与数据库同步,从而保证查询数据的正确性。

  3) 当应用程序显示调用Session的flush()方法时。

  Session在特定的时间清理了缓存,那么是如何清理缓存的呢?

  1) 按照应用程序调用session.save()方法的先后顺序,执行所有对实体进行插入的insert语句。

  2) 执行所有对实体进行更新的update语句。

  3) 执行所有对集合进行删除的delete语句。

  4) 执行所有对集合元素进行删除、更新或者插入的SQL语句。

  5) 执行所有对集合进行插入的insert语句。

  6) 按照应用程序调用sessiondelete()方法的先后顺序,执行所有对实体进行删除的delete语句。

时间: 2024-10-12 09:47:56

Session脏检查及清理缓存机制的相关文章

脏检查及刷新缓存机制

当事务提交时,Hibernate会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变,这种判断称为脏检查 Session session; Transaction tx; @After public void afterTest(){ tx.commit(); HibernateUtil.closeSession(); } @Before public void initDate(){ session=HibernateUtil.getSession(); tx = sess

脏检查 和 缓存清理机制

Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语句,从而同步更新数据库. 缓存清理机制 当Session缓存中对象的属性每次发生了变化,Sessi

Hibernate 脏检查和刷新缓存机制

刷新缓存: Session是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的保存,更新,删除和加载java对象的方法,Session具有一个缓存,可以管理和追踪所有持久化对象,对象和数据库中的相关记录对应,在某些时间点,Session会根据缓存中对象的变化来执行相关SQL语句,将对象包含的变化数据更新到数据库中,这一过程成为刷新缓存. 脏检查: 当刷新缓存时,Hibernate会对Session中的持久状态的对象进行检测,判断对象的数据是否发生了改变,这种判断成为脏检查,

脏检查和刷新缓存机制

脏检查 脏检查是在提交事务的时候会进行脏检查,脏检查会对比快照和原始数据,如果发现数据不匹配就会将session中的数据清理 (在这里补充一下快照和原始数据,快照和原始数据是匹配的数据,在set数据时,会保存两份数据,一份是快照,一份是原始数据) 清理缓存是将session当中不同步的快照数据把他更改的信息更新到数据库,而session中的数据依然存在 清空缓存是将缓存中的数据和数据库的数据同步,缓存中依然存在数据,用session.close()清空数据,那么在session中的Map集合就会

8.29 脏检查笔记

个人理解图 脏检查 Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语句,从而同步更新数据库. 缓存清理机制 当Session缓存中对象的属性每次发

关于Hibernate脏检查与快照

脏检查 Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会 为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来 判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语 句,从而同步更新数据库. 缓存清理机制 当Session缓存中对象的属性每次发生了变

Hibernate 中三种状态及脏检查

java对象的三种状态 持久态: Student stu=new Student() Session.save(stu); Session以及数据库都有 游离态: stu.setId(1); Session.close(); Session没有 数据库中有 瞬时态: Student stu=new Student() 体现:在Session中以及DB都没有 三种状态图: 使用new关键字构建对象,该对象的状态是瞬时状态. 1 瞬时状态转为持久状态 使用Session对象的save()或saveO

Hibernate入门(三)之hibernate 的session的缓存机制

session缓存 缓存的生命周期 当打开session以后,该缓存就开始了,当session关闭以后,该缓存不存在,其生命周期和session的生命周期是一样的 如何将数据存放到缓存中 get方法 session.get方法可以把一个对象放入到session的缓存中,以主键标识该对象,所以我们把这样的主键也叫oid save方法 Session.save方法可以把对象放入到缓存中 update方法 session.update方法把对象放入到了session缓存中 如何测试缓存中是否有数据 说

hibernate笔记--缓存机制之 一级缓存(session缓存)

一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询id=1的Book信息: List<Book> list =(List) session.createQuery("from Book").list(); System.out.println(list.get(0).getName()); Book book = (Book)s