十四、HIbernate缓存

一、一级缓存

  简单来说,同一个session中,你重复去获取同一个对象,如果Hibernate,每次都发出sql语句去查,太麻烦了,于是它每次先去一级缓存中查,如果没有就发出sql语句去数据库中查,同时把查到的对象保存在一级缓存中。下次要用的时候,还是先去一级缓存中查,查到了,就不用再去数据库中查了。

  值得注意的是,一级缓存也叫session级缓存,同一个session是共享一个一级缓存的,当session关闭的时候,这个session里面的缓存也就清空了。

  一级缓存,Session级共享。 save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。

二、二级缓存

  一级缓存是默认存在的,二级缓存是默认不存在的

  要使用二级缓存必须要配置使用,配置好之后,Hibernate查询对象先去一级缓存中查,如果查不到再去二级缓存中查,如果再查不到再发出sql语句去数据库中查,同时将查询到的对象放入二级缓存中

  值得注意的是,二级缓存也叫sessionFactory级缓存,同一个sessionFactory是共享同一个sessionFactory的,当sessionFactory关闭的时候,这个sessionFactory里面的缓存也就清空了。

  二级缓存,sessionFactory级共享,是交给第三方去处理的。 

  配置方式(举例配置OSCache)

1.引入jar包 链接:https://pan.baidu.com/s/1qYZaozy 密码:wjfn

2.配置hibernate.cfg.xml

<property name="cache.use_second_level_cache">true</property><!-- 启用二级缓存 -->
<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property><!-- 配置适配器类 -->

3.配置要对哪个domain对象配置二级缓存

  3.1方法一,在hibernate.cfg.xml中配置

<class-cache usage="read-only" class="com.myz.domain.Employee"/>

  3.2方法二,在Employee.hbm.xml中配置

<hibernate-mapping package="com.myz.domain">
    <class name="Employee">
    <cache usage="read-only"/>
        <id name="id">
        <generator class="assigned"></generator>
        </id>
        
        <property name="name">
            <column name="name"></column>
        </property>
        
        <many-to-one name="dep" column="dep_id"></many-to-one>
    </class>
</hibernate-mapping>

  3.3

  hibernate二级缓存策略

  ■ 只读缓存(read-only)

  ■ 读写缓存(read-write) [ 银行,财务软件]

  ■ 不严格读写缓存(nonstrict-read-write) [bbs 被浏览多少次]

  ■ 事务缓存(transactional)

  4.拷贝一个oscache.propertis配置文件,hibernate-3.2etcoscache.propertis目录下,

  5.统计信息打开generate_statistics,用sessionFactory.getSatistics()获取统计信息。

<property name="hibernate.generate_statistics">true</property>
原文地址:https://www.cnblogs.com/myz666/p/8447974.html