Session执行一些sql语句把内存中的对象的状态同步到数据库,这个过程被称为session清理.
在默认情况下,Session会在下面的时间点清理缓存。
1 当应用程序调用net.sf.hibernate.Transacation的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。
2 当应用程序调用Session的find()或者iterate()时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。
3 当应用程序显示调用Session的flush()方法的时候。
注意Session的commit()和flush()方法的区别。
flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;
commit()方法会先调用flush()方法,然后提交事务。提交事务意味着对数据库所做的更新被永久保存下来。
执行session清理的顺序:
1.按照应用程序调用session.save()方法的衔后顺序,执行所有对实进行插入的insert语句。
2.执行所有对实体进行更新的update语句。
3.执行所有对集合进行删除的delete语句。
4.执行所有对集合元素进行删除、更新或者插入的SQL语句。
5.执行所有对集合进行插入的insert语句。
6.按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句。
Session的setFlushMode()方法用于设定清理缓存的时间点。FlushMode类定义了三种不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT和FlushMode.NEVER。
清理缓存的模式 |
Session的查询方法 |
Session的commit()方法 |
Session的flush()方法 |
FlushMode.AUTO | 清理 | 清理 | 清理 |
FlushMode.COMMIT | 不清理 | 清理 | 清理 |
FlushMode.NEVER | 不清理 | 不清理 | 不清理 |
在批量处理大量数据的时候为了避免内存溢出,可手动干预一级缓存:
Session.evict 将某个对象从一级缓存移除;如:getSession().evict(member);
Session.clear 清理该session的所有缓存对象。