您的当前位置:首页正文

Hibernate学习笔记之----理解对象的持久性与一级缓存机制

2024-11-08 来源:个人技术集锦

   1.在上一篇文章中提到,说Hibernate是最常用得数据访问层框架,经常也被称为持久层框架,那么为什么会被称为持久层框架呢,在这里我们首先要明白Hibernate程序的运行过程中的实体对象所具有的三种状态,即以下三种状态:


       a.临时状态(Transient):
         采用new关键字创建的对象,也叫自由态对象,它只存在于内存中,而在数据库中没有相应数据。它没有持久化,没有处于Session中,未与session发生关联,处于此状态的对象叫临时对象。
      *b.持久状态(Persistent):

           实体对象与session发生关联,并且在数据库中有相应数据。已经被持久化,加入到了Session缓存中。

           例如调用了session的方法get、load、save、update等方法得到的对象,处于此状态的对象被称为持久对象

                        持久对象具有以下特点:
                        (1).对象生命期时间持久,垃圾回收器无法回收
                        (2).对象的数据可以与数据库的数据同步(这是持久对象最大的特点),由session对象负责管理和同步。
                        (3).持久对象在session的一级缓存中存放
       c.游离状态(Detached):

                        原来是持久对象,后来不受session管理了,也就是被持久化过的,然后从session的一级缓存被移除了的对象。

在程序运行过程中这三种状态可以通过特定的操作而进行状态的转化:如处于临时对象经过调用session的get()、load()、find()等方法后会转变为持久对象,被存入session中,而持久对象经过调用delete()方法后又会变为临时对象;游离对象经过调用update()、saveOrUpdate和lock()方法后会变为持久对象,而持久对象经过调用evict()、close()和clear()方法后又会变为游离对象,临时对象与游离对象都会被垃圾回收器回收,而持久对象不会被垃圾回收器回收,生命周期比较长,这也就是为什么会被称为持久对象的原因,三种状态之间的具体转换如下图所示:

              
    2..一级缓存机制:
                  一级缓存被称为是session级别的缓存,每个session都有自己独立的缓存区,该缓存区随着session的创建而开辟,
                  随着session.close()而释放;该缓存区可以存放当前session关联的对象(持久对象),由于一级缓存中存放的是持久对象,也就是在数据库中有对应数据的对象,这就为我们查询时提供了极大的好处,
如下:
                  一级缓存的好处:当Hibernate在查询时,会先去缓存中查找满足条件的结果,如果缓存中有满足条件的持久对象,则会直接返回这个对象,而不会再去访问数据库查询,如果缓存没有满足条件的结果才会去访问数据库进行查询。

                  如果利用 Session对同一个对象查询多次,则第一次会去DB查询,之后会从缓存中获取,这样就减少了与数据库交互的次数,从而也就提高了查询的性能。

            例如当执行下面语句时:

                Foo foo= (Foo)session.load(Foo.class, 1);
           将会首先去session缓存中查找该对象,如果找到就直接返回,若找不到便会去访问数据库进行查询.

       但是这种缓存机制也有一定的局限性,由于一级缓存中要存放大量持久对象,造成了内存开销很大,很可能发生内存溢出,所以要及时清除垃圾对象,管理好一级缓存,

      管理session一级缓存的方法如下:

         1.session.evict(obj); //清除obj对象
         2.session.clear();  //清除所有对象

         3.session.close();  //清除所有对象并关闭连接

   采用以上方法会将持久对象从session的一级缓存中清除,从而转变成游离对象,减少内存的开销。

显示全文