Cache就是缓存,它往往是提高系统性能的最重要手段,对数据起到一个蓄水池和缓冲的作用。

Cache对于大量依赖数据读取操作的系统而言尤其重要。在大并发量的情况下,如果每次程序都需要向数据库直接做查询操作,它们所带来的性能开销是显而易见的,频繁的网络请求,数据库磁盘的读写操作都会大大降低系统的性能。

此时如果能让数据库在本地内存中保留一个镜像,下次访问的时候只需要从内存中直接获取,那么显然可以带来不小的性能提升。

引入Cache机制的难点是如何保证内存中数据的有效性,否则脏数据的出现将会给系统带来难以预知的严重后果。

虽然一个设计得很好的应用程序不用Cache也可以表现出让人接受的性能,但毫无疑问,一些对读取操作要求比较高的应用程序可以通过Cache获得更高的性能。

对于应用程序,Cache通过内存或磁盘保存了数据库中的当前有关数据状态,它是一个存储在本地的数据备份。Cache位于数据库和应用程序之间,从数据库更新数据,并给程序提供数据。

Hibernate实现了良好的Cache机制,可以借助Hibernate内部的Cache迅速提高系统的数据读取性能。Hibernate中的Cache可分为两层:一级Cache和二级Cache。

一级缓存

Hibernate默认是开启一级缓存的,一级缓存存放在session上,属于事务级数据缓冲。

二级缓存

二级缓存是在SessionFactory,所有的Session共享同一个二级Cache。二级Cache的内部如何实现并不重要,重要的是采用哪种正确的缓存策略,以及采用哪个Cache提供器。

二级缓存也分为了两种

内置缓存

Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映射元数据和提前定义的SQL语句放置到SessionFactory的缓存中。该内置缓存是仅仅读的。

外置缓存

通常说的二级缓存也就是外置缓存,在默认情况下SessionFactory不会启用这个缓存插件,外置缓存中的数据是数据库数据的复制,外置缓存的物理介质能够是内存或者硬盘。

并发访问策略

适合放入二级缓存中数据

非常少被改动

不是非常重要的数据。同意出现偶尔的并发问题


不适合放入二级缓存中的数据

常常被改动

財务数据,绝对不同意出现并发问题

与其它应用数据共享的数据


二级缓存的配置

hibernate支持的缓存插件
  • EHCache: 可作为进程范围内的缓存,存放数据的物理介质能够是内存或硬盘,对Hibernate的查询缓存提供了支持
  • OpenSymphony:可作为进程范围内的缓存,存放数据的物理介质能够是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持
  • SwarmCache:可作为集群范围内的缓存,但不支持Hibernate的查询缓存
  • JBossCache:可作为集群范围内的缓存,支持Hibernate的查询缓存

二级缓存配置步骤

以下以ehcache缓存为例,来讲一下二级缓存的配置

先看一下没有缓存时发起sql语句的条数, 和配置缓存后对比

1、拷贝jar包和创建配置文件ehcache.xml到src目录下
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="d:/ehcache/"></diskStore>
<!-- 默认缓存配置 -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>
2、在hibernate.cfg.xml中开启二级缓存
<propertyname="hibernate.cache.use_second_level_cache">true</property>
3、配置二级缓存技术提供者
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property
4、配置使用缓存的类
<class-cache usage="read-write" class="cn.ybzy.hibernatedemo.model.Employee"/>
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐