首页 > 代码库 > hibernate中缓存的初步认识

hibernate中缓存的初步认识

为什么实用缓存

     目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能.hibernate如果使用了缓存,在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应用程序对物理数据源的访问,使得程序的运行性能明显的提升.

 

  查询时使用缓存的实现过程为:首先查询一级缓存中是否具有需要的数据,如果没有,查询二级缓存,如果二级缓存中也没有,此时再执行查询数据库的工作。要注意的是:此3种方式的查询速度是依次降低的。

 

    Hibernate缓存分为二级,第一级存放于session中称为一级缓存,默认带有且不能卸载。第二级是由sessionFactory控制的进程级缓存,称为二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所以的session共享。生命周期和SessionFactory生命周期一致,SessionFactory可以管理二级缓存。

一级缓存

    一级缓存是缓存实体对象,Load/get/iterate查询实体对象支持一级缓存。

    evit(Object obj)  将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象.

    clear() 将一级缓存中的所有持久化对象清除,释放其占用的内存资源

    contains(Object obj) 判断指定的对象是否存在于一级缓存中.

    flush() 刷新一级缓存区的内容,使之与数据库数据保持同步.

 

有一级缓存了为什么还要使用二级缓存

     因为Session的生命期往往很短,存在于Session内部的第一级最快缓存的生命期当然也很短,所以第一级缓存的命中率是很低的。其对系统性能的改善也是很有限的。

 

二级缓存

    二级缓存的实现原理与一级缓存是一样的,二级缓存也是缓存实体对象的。evict(Classarg0, Serializable arg1)  将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源.

什么时候适加载到二级缓存中:

  1.数据更新频率低

  2.允许偶尔出现并发问题的非重要数据

  3.不会被并发访问的数据

  4.常量数据

  5.不会被第三方修改的数据

反之,下面情况就不适合使用二级缓存

  1.经常被修改的数据

  2.绝对不允许出现并发访问的数据

  3.与其他应用共享的数据 

一级缓存和二级缓存的交互,如可以禁止将一级缓存放到二级缓存里。

 

查询缓存

    查询缓存默认是关闭的,不启用的。查询缓存是缓存普通属性结果集的,对实体对象的结果集会缓存id。生命周期是,当关联的表发生修改时,查询缓存的生命周期结束。不紧要在配置文件里开启查询缓存,在程序里也必须要启用。