zoukankan      html  css  js  c++  java
  • Hibernate缓存原理

    对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.

    简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等,

    但随之带来的就是数据访问效率的降低,和性能的下降,而缓存就是弥补这一缺点的重要方法.

         缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,它位于数据库与数据库访问层中间.ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据作为结果加以利用,从而避免了数据库调用性能的开销.而相对内存操作而言,数据库调用是一个代价高昂的过程.

         一般来讲ORM中的缓存分为以下几类:
             1:事务级缓存:即在当前事务范围内的数据缓存.就Hibernate来讲,事务级缓存是基于Session的生命周期实现的,每个Session内部会存在一个数据缓存,它随着 Session的创建而存在,随着Session的销毁而灭亡,因此也称为Session级缓存。
             2:应用级缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享(数据库事务或应用事务),事务之间的缓存共享策略与应用的事务隔离机制密切相关.在Hibernate中,应用级缓存由SessionFactory实现,所有由一个SessionFactory创建的 Session实例共享此缓存,因此也称为SessionFactory Level Cache.
             3:分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略.分布式缓存由多个应用级缓存实例组成,通过某种远程机制(RMI,JMS)实现各个缓存实例间的数据同步,任何一个实例的数据修改,将导致整个集群间的数据状态同步.

    Hibernate的一,二级缓存策略:

      Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可动态加载和卸载,属于多事务级别,要防止事务并发性。

    缓存是以map的形式进行存储的(key-id,value-object)

    一级缓存(Session):

       事务范围,每个事务(Session)都有单独的第一级缓存.

       一级缓存的管理:当应用程序调用Session的save()、update()、saveOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()--(用的是n+1次查询,先查id)或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。程序关闭session时,Hibernate会根据缓存中对象的状态变化来同步更新数据库,也可以显式调用Session的flush()方法。这种缓存机制可以减少与数据库的交互,从而提高数据库的访问性能。

    Session为应用程序提供了两个管理缓存的方法:

                 evict(Object obj):从缓存中清除参数指定的持久化对象。

                 clear():清空缓存中所有持久化对象,

                 flush():使缓存与数据库同步。

    当查询相应的字段如(name),而不是对象时,不支持缓存。

    二级缓存(SessionFactory):

      Hibernate的二级缓存策略的一般过程如下:

       1:条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL句查询数据库,一次获得所有的数据对象(这个问题要考虑,如果你查询十万条数据时,内存不是被占用)。

     2:把获得的所有数据对象根据ID放入到第二级缓存中。

     3: 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。

       4:删除、更新、增加数据的时候,同时更新缓存。

      Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache

    Q:什么样的数据适合存放到第二级缓存中?

        1.很少被修改的数据

        2.不是很重要的数据,允许出现偶尔并发的数据

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

        4.参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

     不适合存放到第二级缓存的数据?

        1 经常被修改的数据

        2 财务数据,绝对不允许出现并发

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

    配置二级缓存的主要步骤:

      1 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。

      2 选择合适的缓存插件,然后编辑该插件的配置文件。

    简单理解:Hibernate第一次访问某个实体,从数据库读取对应记录,填充该实体对象,用完之后把该对象存放在一个Map(Map在内存中)中,(key-id,value-object)对,当Session试图访问某个对象时,它会先访问这个Map,根据ID看看该实体是否在缓存中,在就直接存取,不在就重复刚才的步骤。

    一级缓存只对当前session有效,二级缓存对所有session有效。一级、二级缓存都是对整个实体进行缓存,不会缓存普通属性,如果想对普通属性进行缓存,可考虑用查询缓存。

  • 相关阅读:
    [idea]2014.1.13
    [idea]2014.1.12
    纪念我2014.1.4 中国银行广东分行面试
    [essay]2014.1.2
    纪念我12月29日南方电网笔试
    [essay]12.26
    [idea]
    纪念我12月24日终于用妖姬拿首胜了
    Android自动化测试环境部署
    Monitor工具使用详解
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4341456.html
Copyright © 2011-2022 走看看