3. 理解 S ession 的缓存
当 S ession 的 save( ) 方法持久化一个 Custom 对象时
er
, Custom 对象被加入到 S ession 的缓存中,以后
er
即使应用程序中的引用变量不再引用 Custom 对象 er
,只要 S ession 的缓存还没有被清空, Custom 对 er
象仍然处于生命周期中。
当 S ession 的 load( ) 方法试图从数据库中加载一个
Custom 对象时, S ession 先判断缓存中是否已经存
er
在这个 Custom 对象,如果存在,就不需要再到数
er
据库中检索。
www.sodi.com.cn
8. 清理缓存的时间点
在默认情况下, S ession 会在下面的时间点清理缓
存:
当应用程序调用 net.sf.hibernate.T ransaction 的 commit( ) 方
法的时候, commit( ) 方法先清理缓存,然后再向数据库
提交事务。
当应用程序调用 S ession 的 find( ) 或者 iterate( ) 时,如果
缓存中持久化对象的属性发生了变化,就会先清理缓存
,以保证查询结果能反映持久化对象的最新状态。
当应用程序显示调用 S ession 的 flush( ) 方法的时候。
S ession 进行清理缓存的例外情况是:如果对象使用
native生成器来生成 OI D ,那么当调用 S ession 的
save( ) 保存该对象时,会立即执行向数据库插入该
实体的 insert 语句。
www.sodi.com.cn
9. 设定 S ession 清理缓存的时间点
S ession 的 setFlushMode( ) 方法用于设定清理缓存的
时间点。 FlushMode类定义了三种不同的清理模式
: FlushMode.A UTO 、 FlushMode.COMMI T 和
FlushMode.NE VE R ,具体如下表:
清理缓存的模 Session 的查询方 Session 的
Transaction 的 commit()
式 法 flush()
AUTO 清理 清理 清理
COMMIT 不清理 清理 清理
NEVER 不清理 不清理 清理
FlushMode.A UTO 是默认值,这也是优先考虑的清
理模式,它会保证在整个事务中,数据保持一致
。
www.sodi.com.cn
10. COMMI T 和 NE VE R 清理模式
如果事务仅包含查询数据库的操作,而不会修改
数据库的数据,也可以选用 FlushMode.COMMI T
模式,这可以避免在执行 S ession 的查询方法时先
清理缓存。
在多数情况下,应用程序不需要显式调用 S ession
的 flush( ) 方法, flush( ) 方法适用于以下场合:
插入、删除或更新某个持久化对象会引发数据库中的触
发器。
在应用程序中混合使用 Hibernate A PI 和 JDB C A P I 。
JDB C 驱动程序不健壮,导致 Hibernate在自动清理缓存
的模式下无法正常工作。
www.sodi.com.cn