第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);

posted on 2018-01-31 22:29  東風★破  阅读(131)  评论(0)    收藏  举报

导航