Hibernate的Session

来源:互联网 发布:知乎日耳曼和凯尔特 编辑:程序博客网 时间:2024/05/17 23:08

理解Session的缓存:

当session的save()方法持久化一个对象时,该对象被载入缓存,以后即使程序中不再引用该对象,只要缓存不清空,该对象仍然处于生命周期中。当试图load()对象时,会判断缓存中是否存在该对象,有则返回。


缓存的作用:

1.减少访问数据库的频率。

2.保证缓存中的对象与数据库中的相关记录保持同步。

3.当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。


注意:session中有监控功能是因为它对每个对象都会产生一个快照

当Session加载了customer对象后,会为customer对象的值类型的属性复制一份快照。当清理缓存时,通过比较对象的当前属性和快照,来判断对象的哪些属性发生了变化。

如图:



session.refresh():刷新,让缓存数据参照数据库数据进行缓存中数据的更新。

session.flush():清理,让数据库数据参照缓存数据进行数据库中数据的更新,但是并不提交事务。

session.clear():清空,删掉所有缓存的引用。(但是并不意味着被引用的对象立即被垃圾回收机制清除,因为还可能有其他变量引用此对象)


注意session的commit()和flush()方法的区别:

1.flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务

2.commit()方法会先调用flush()方法,然后提交事务。提交事务意味着对数据库所做的更新被永久保存下来。