1.在上一篇文章中提到,说Hibernate是最常用得数据访问层框架,经常也被称为持久层框架,那么为什么会被称为持久层框架呢,在这里我们首先要明白Hibernate程序的运行过程中的实体对象所具有的三种状态,即以下三种状态:
实体对象与session发生关联,并且在数据库中有相应数据。已经被持久化,加入到了Session缓存中。
例如调用了session的方法get、load、save、update等方法得到的对象,处于此状态的对象被称为持久对象
持久对象具有以下特点:原来是持久对象,后来不受session管理了,也就是被持久化过的,然后从session的一级缓存被移除了的对象。
在程序运行过程中这三种状态可以通过特定的操作而进行状态的转化:如处于临时对象经过调用session的get()、load()、find()等方法后会转变为持久对象,被存入session中,而持久对象经过调用delete()方法后又会变为临时对象;游离对象经过调用update()、saveOrUpdate和lock()方法后会变为持久对象,而持久对象经过调用evict()、close()和clear()方法后又会变为游离对象,临时对象与游离对象都会被垃圾回收器回收,而持久对象不会被垃圾回收器回收,生命周期比较长,这也就是为什么会被称为持久对象的原因,三种状态之间的具体转换如下图所示:
如果利用 Session对同一个对象查询多次,则第一次会去DB查询,之后会从缓存中获取,这样就减少了与数据库交互的次数,从而也就提高了查询的性能。
例如当执行下面语句时:
Foo foo= (Foo)session.load(Foo.class, 1);将会首先去session缓存中查找该对象,如果找到就直接返回,若找不到便会去访问数据库进行查询.
但是这种缓存机制也有一定的局限性,由于一级缓存中要存放大量持久对象,造成了内存开销很大,很可能发生内存溢出,所以要及时清除垃圾对象,管理好一级缓存,
管理session一级缓存的方法如下:
3.session.close(); //清除所有对象并关闭连接
采用以上方法会将持久对象从session的一级缓存中清除,从而转变成游离对象,减少内存的开销。