1. 清空缓存
当调用session.evict(customer); 或者session.clear(); 或者session.close()方法时,Session的缓存被清空。
2. 清理缓存
Session具有一个缓存,位于缓存中的对象处于持久化状态,它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中持久化对象的属性变化来同步更新数据库,这一过程被称为清理缓存。
在默认情况下,Session会在下面的时间点清理缓存。
当应用程序调用org.hibernate.Transaction的commit()方法的时候,commit()方法先清理缓存,然后在向数据库提交事务;
当应用程序调用Session的list()或者iterate()时(【注】get()和load()方法不行),如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能能反映持久化对象的最新状态;
当应用程序显式调用Session的flush()方法的时候。
如何查看hibernate session缓存中的东西
session缓存的原理是这样的:session缓存接口的实现类sessionimpl定义了一系列的java集合,这些集合构成了session的缓存。例如:
//map集合的键对象代表持久化对象的oid,值对象代表持久化对象
private final map entitiesbykey;
.........
//向session的缓存中加入一个持久化对象
entitiesbykey.put(key,object);
.........
//从session的缓存中删除一个持久化对象
entitiesbykey.remove(key);
以session的save()和load()方法为例,假如我们定义了一个名为customer的持久化类。当session的save()持久化一个customer对象时,customer对象被加入到session的缓存中,以后即使应用程序中的引用变量不再引用customer对象,只要session的缓存还没有被清空,customer对象仍然处于生命周期中。当session的load()方法试图从数据库中加载一个customer对象时,session先判断缓存中是否已经存在这个customer对象,如果存在,就不需要再到数据库中检索了。
另外,当session的缓存中加载了customer对象后,会为customer对象的属性的值复制一份快照。当session清理缓存时,通过将customer对象的当前属性与其快照进行比较,判断customer对象的哪些属性发生了变化。如果有属性的值发生了变化,hibernate会将变化同步到数据库中。
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....