一、一级缓存
简单来说,同一个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>