hibernate的一级缓存和二级缓存机制

来源:互联网 发布:js代码混淆 编辑:程序博客网 时间:2024/05/22 14:01
 Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能,hibernate出现了缓存机制,总的来说,缓存机制是为了减少对数据访问数据库的频率,应用程序从内存中读取持久化对象的速度显然比到数据库中查数据速度快多了,因此缓存可以提高数据访问的性能。

hibernate将缓存分为一级缓存和二级缓存
一、一级缓存:
1、Hibenate中的一级缓存,也叫做session的缓存,它是内置的,同时这种缓存不具有可选性,不可以取消session缓存,它可以在session范围内减少数据库的访问次数!只在session范围有效!Session关闭,一级缓存失效!
2、当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,如果session缓存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭的时候该Session所管理的一级缓存也会立即被清除。
3、当程序调用get(),load(),iterate(查询实体对象才支持一级缓存,查询普通属性则不支持一级缓存)时,Hibernate会先到缓存中去拿,如果缓存中已经存在目标对象,则直接拿来而不再查询数据库,否则,必须发出查询语句到数据库中查。
4、Session的缓存由hibernate维护,用户不能操作缓存内容;如果想操作缓存内容,必须通过hibernate提供的
session.flush();让一级缓存与数据库同步
session.evict(arg0);清空一级缓存中指定的对象
session.clear();清空一级缓存中缓存的所有对象方法操作。

对于一级缓存,在(当前)session范围有效,作用时间短,效果不是特别明显!在短时间内多次操作数据库,效果比较明显!

二、二级缓存
Hibernate提供了基于应用程序级别(对整个应用程序都有效)的缓存,可以跨多个session,即不同的session都可以访问缓存数据。这个缓存也叫二级缓存。Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可,如果开启了二级缓存,hibernate在执行任何一次查询的之后,都会把得到的结果集放到缓存中,缓存结构可以看成是Map的key-value, key是数据库记录的id,value是id对应的pojo对象
而如果不想用,直接移除,不影响代码。

    在默认情况下, SessionFactory 不会启用这个缓存插件. 外置缓存中的数据是数据库数据的复制, 外置缓存的物理介质可以是内存或硬盘,list() 默认情况只会放入缓存,不会从一级缓存中取!使用查询缓存,可以让list()查询从二级缓存中取!
<!-- a.  开启二级缓存 -->        <property name="hibernate.cache.use_second_level_cache">true</property>        <!-- b. 指定使用哪一个缓存框架(默认提供的) -->        <property       name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider        </property>        <!--开启查询缓存 -->        <property name="hibernate.cache.use_query_cache">true</property>        <!-- c. 指定哪一些类,需要加入二级缓存 -->    <class-cache usage="read-write" class="cn.itcast.b_second_cache.Dept"/>        <class-cache usage="read-only" class="cn.itcast.b_second_cache.Employee"/>        <!--集合缓存[集合缓存的元素对象,也加加入二级缓存] -->        <collection-cache           usage="read-write"              collection="cn.itcast.b_second_cache.Dept.emps"/>
    对于二级缓存和一级缓存主要的不同是它们的作用范围不同。一级缓存是session级别的。也就是只有在同一个session里缓存才起作用。而二级缓存是sessionFactory级别的。其缓存对同一个sessionFactory生产出来的session都有效,有可能出现并发问题。

三、最后:
二级缓存一般存放: 
1 很少被修改的数据   
2 不是很重要的数据,允许出现偶尔并发的数据   
3 不会被并发访问的数据   

不适合存放到第二级缓存的数据?   
1。经常被修改的数据   
2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
3 与其他应用共享的数据。

Hibernate开启二级缓存后如何查找对象?
1、当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存 删除、更新、增加数据的时候,同时更新缓存 Hibernate管理缓存实例
2、我们在管理Hibernate缓存时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。 当随后flush()方法被调用时,对象的状态会和数据库取得同步。

1 0
原创粉丝点击