第4.30课 上课 缓存
4_30

缓存
一级缓存
一级缓存(缓存的是对象):
-- 跟Session相关(存放在内存中).
-- 默认是开启的.
-- Session存活时间短,当Session关闭时,一级缓存将被清空,从而释放内存。
作用
提高CRUD操作的性能,当一级缓存中存在该对象时,
我们只要对该对象进行操作就可以影响表中这一行数据,
从而避免反复操作数据库表。
操作一级缓存的方法
contains(Object object)
boolean contains(Object object)
-- 判断Session的一级缓存中是否包含一个对象,包含的话这个对象就是持久化状态。
evict(Object object)
void evict(Object object)
-- 从Session的一级缓存中逐出一个对象.(该对象就不是持久化状态的对象).
flush()
void flush()
-- 将Session的一级缓存中的对象,同步到底层数据库表中.(立即同步)
clear()
void clear()
-- 清空Session的一级缓存,所有的持久化状态的对象都清空。(释放内存)
close()
void close()
-- 关闭Session,先调用flush(),再调用clear().
二级缓存
二级缓存(缓存的是对象):
-- 跟SessionFactory相关,因为SessionFactory存活的时间长。
-- 默认是关闭的.
-- 二级缓存中的对象存放到哪里,这个需要配置.
一般会配置内存中存放一些对象,超出了内存中放存的对象个数,就写入磁盘.
project/etc/ehcache.xml (配置二级缓存对象存放的配置文件).
注意:二级缓存只存储对象,不会存储单个属性:
例如: select s from Student s 会存储查询出来的s对象
select s.name from Student s 不会存储查询出来的单给属性
作用
二级缓存:
-- 提高查询效率
-- 当你做查询时,它会先到二级缓存中根据主键值找对象,
如果没找到就会到一级缓存中找对象,再没有找到就会到数据库表中查询该对象。
使用二级缓存步骤
配置开启二级缓存
在hibernate.cfg.xml全局的配置文件中开启二级缓存:
<!-- 配置开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 配置二级缓存的提供商 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
拷贝二级缓存需要的jar包
lib\optional\ehcache
ehcache-2.10.1.jar
hibernate-ehcache-5.*.Final.jar
slf4j-api-1.7.7.jar
SLF4J : Simple Logging Facade for Java java的日志门面的jar包(日志规范).
ehcache.xml缓存配置文件
<ehcache>
<!-- diskStore: 配置二级缓存中的对象磁盘存储目录 -->
<diskStore path="F:\\ehcache"/>
<!-- 配置默认缓存区:
maxElementsInMemory : 配置二级缓存中的对象在内存中存放的最大数量.
eternal : 二级缓存中的对象是否永久有效。true: 永久有效、false: 不是永久有效.
timeToIdleSeconds : 配置二级缓存中的对象空闲的有效时间 120秒.
timeToLiveSeconds : 配置二级缓存中的对象存活的有效时间 120秒.
overflowToDisk : 配置二级缓存中的对象超出了内存中存放的最大数量,就写入磁盘.
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<!-- 配置命名的缓存区 -->
<cache name="yayadouCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>
配置哪些持久化类使用二级缓存
xml文件中配置
在hibernate.cfg.xml配置
<!-- 配置持久化类用二级缓存 -->
<class-cache usage="read-write" class="com.yayadou.domain.Teacher" region="yayadouCache"/>
持久化类上加注解
在持久化类上注解:
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE, region="yayadouCache").
ehcache缓存并发策略

操作二级缓存
获取缓存对象(Cache)
Cache cache = sessionFactory.getCache()
containsEntity()
判断二级缓存中是否包含一个对象:
boolean containsEntity(Class entityClass, Serializable identifier);
boolean containsEntity(String entityName, Serializable identifier);
evictAllRegions()
清空二级缓存中所有的缓存对象:
void evictAllRegions();
evictEntity()
从二级缓存中踢出指定的对象:
void evictEntity(Class entityClass, Serializable identifier);
void evictEntity(String entityName, Serializable identifier);
evictEntityRegion()
从二级缓存中踢出指定类型的所有对象:
void evictEntityRegion(Class entityClass);
void evictEntityRegion(String entityName);
缓存统计信息
配置生成统计信息
在hibernate.cfg.xml文件中配置生成统计信息:
<!-- 配置生成缓存的统计信息 -->
<property name="hibernate.generate_statistics">true</property>
<!-- 让Hibernate4用更友好的方式格式化统计信息 -->
<property name="hibernate.cache.use_structured_entries">true</property>
获取统计信息对象(Statistics)
Statistics statistics = sessionFactory.getStatistics();
获取二级缓存命中数量
获取二级缓存命中的数量: statistics.getSecondLevelCacheHitCount();
获取二级缓存错失数量
获取二级缓存错失的数量:statistics.getSecondLevelCacheMissCount();
获取二级缓存统计信息对象(SecondLevelCacheStatistics)
/** 获取学生的二级缓存的统计信息 */
SecondLevelCacheStatistics scs = statistics.getSecondLevelCacheStatistics("org.yayadou.domain.Student");
System.out.println(scs.getEntries());
对象在二级缓存中用什么格式保存。
Map集合:
-- key: 主键列的值.
-- value: 缓存对象,该对象对需要缓存的对象中的数据做了封装.
查询缓存
查询缓存(缓存的是查询语句):
-- 默认是关闭的.
-- 它是在二级缓存的基础之上.
查询缓存的缓存数据格式:
{"sql语句" : {"org.yayadou.hibernate.domain.Student" : [1,2,3,4,5,6],
"org.yayadou.hibernate.domain.Teacher" : [1,2]}}
注意:它要求hql语句要一致,而且hql语句中的占位符赋值也要一致,才能命中.
作用
提高查询效率.
-- 它缓存的是查询语句与查询出来的对象主键值.
使用查询缓存的步骤
配置开启查询缓存
在hibernate.cfg.xml文件中配置开启查询缓存.
<!-- 配置开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
调用query方法设置用查询缓存
在创建查询时需要设置用查询缓存:
query.setCacheable(true);
浙公网安备 33010602011771号