Hibernate session的缓存

来源:互联网 发布:行知科技 编辑:程序博客网 时间:2024/05/20 02:27

                Hibernate的SessionFactory是线程安全的,这个SessionFactory负责创建Session实例,这个Session实例却是非线程安全的。一个数据源对应一个SessionFactory,而一个SessionFactory能产生多个Sessioni实例。至于为什么,本人还没有研究那么深,在这里不做任何解释。使用Hibernate时对象的生命周期、事务的管理、数据库的存取都与Session相关,所以这里重点说一下这个Session。

                如果希望一个对象一直处于生命周期中,就必须保证至少一个变量应用它,如下图所示:

上图表示对象的内存分配以及对象关系。c一直引用Customer对象,Customer对象的生命周期就不会结束,当c不在引用Customer对象时,垃圾收集器就会在某个时间点将该对象清理掉,该对象生命周期结束。关于内存分配和垃圾收集的信息可以参考《深入理解Java虚拟机:JVM高级特性与最佳实践》。

               SessionFactory是一级缓存,Session是二级缓存,通常我们使用的j对象都是放在这个Session缓存中的,只要Session实例没有结束生命周期,那么存放在它缓存中的对象也不会结束生命周期。如上图所示,当调用Session的save方法持久化Customer对象时,Customer对象会被加入到Session缓存中,只要Session缓存没有被清空,那么Customer对象就仍处於生命周期中,那么其他与之关联的对象就可以调用该对象。

             Session缓存的作用:

1:减少访问数据库的频率。对象放在缓存中,从缓存中读取数据要比从数据库中读取数据更快。图1为session中get方法的查询时序图

 

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

3:保证数据库中的记录与缓存中相应对象保持同步。这里涉及脏检查及清理缓存的机制,在此不做过多解释。