hibernate缓存:一级缓存,二级缓存
1.一级缓存:即session级别的缓存,亦即事务级别的缓存策略,这种缓存策略是Hibernate内置的,不可被拆卸的
2.二级缓存:即SessionFactory的外置缓存,其同时也称为进程级缓存或集群范围内的缓存。
(1)由于二级缓存是进程级的可能出现多线程并发问题,需要设置缓存的并发策略
(2)二级缓存是独立于Hibernate的软件部件,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等
(3)hibernate的二级缓存是需要第三方支持的,hibernate默认的二级缓存插件为ehcache
(hibernate二级缓存多应用在多读少写的实体对象中!)
使用hibernate注解方式使用二级缓存开发步骤
1、在src文件夹下添加ehcache.xml配置文件 ;
<ehcache>
<?xml version="1.0" encoding="UTF-8"?>
<!-- maxElementsInMemory="10000" 缓存中最大允许创建的对象数 -->
<!-- eternal="false" 缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期 -->
<!-- timeToIdleSeconds="10" 缓存数据钝化时间(设置对象在它过期之前的空闲时间) -->
<!-- timeToLiveSeconds="20" 缓存数据的生存时间(设置对象在它过期之前的生存时间) -->
<!-- overflowToDisk="true" 内存不足时,是否启用磁盘缓存 -->
<!-- 指定一个文件目录,当EhCache把数据写到硬盘上时,将把数据写到这个文件目录下 -->
<diskStore path="java.io.tmpdir"/>
<!-- 设定缓存的默认数据过期策略 -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="10"
timeToLiveSeconds="20"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"/>
</ehcache>
2.hibernate配置文件中,配置Ehcache相关属性(如果与spring整合,直接在spring的配置文件applicationContext.xml中添加)
<!-- 使用二级缓存:false -->
hibernate.cache.use_second_level_cache=true
<!-- 启动查询缓存:false -->
hibernate.cache.use_query_cache=true
<!-- 二级缓存插件:org.hibernate.cache.EhCacheProvider -->
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
<!-- 是否收集有助于性能调节的统计数据:true -->
hibernate.generate_statistics=true
3.引入相应jar包(如果还在手动添加jar包的,可以尝试使用maven)
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>3.6.9.Final</version>
</dependency>
( 这样就引入了hibernate-ehcache-3.6.9.jar及其依赖包ehcache-core-2.4.3.jar)
4.注解方式配置实体, 在实体上配置@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 并指定缓存 并发策略。
4.1:Eache的四种缓存并发策略如下
(1)read-write(读写型):更新缓存的时候会锁定缓存中的数据
(2)nonstrict-read-write(非严格读写型):不锁定缓存中的数据
(3)read-only(只读型):适用从来不会被修改的数据(如参考数据)
(4)transactional:提供对全事务缓存机制的支持,比如JBoss TreeCache
4.2:Eache缓存用到的注解
(1)@Cacheable: 作用在方法上,触发缓存读取操作
(2)@CacheEvict: 作用在方法上,触发缓存失效操作
(3)@CachePut: 作用在方法上,触发缓存更新操作
(4)@Cache: 作用在方法上,综合上面的各种操作,在有些场景下,调用业务会触发多种缓存操作
(5)@CacheConfig: 在类上设置当前缓存的一些公共设置
5.Eache缓存优缺点
(1)与java程序是绑在一起的,java程序活着,它就活着
(2)可以集群,可以整合Spring,Spring Boot中
(3)不能保证数据的安全,Cache只是简单的加速:有可能产生数据不一致的情况,清除缓存可解决
(4)主要是对数据库访问的缓存,相同的查询语句只需查询一次数据库,从而提高了查询的速度
(5)是一个纯Java的进程内缓存框架,具有快速、精干等特点
(6)使用磁盘Cache的时候非常占用磁盘空间
6.Eache缓存磁盘路径设置
(1)<diskStore path="java.io.tmpdir"/>这个是磁盘存储路径,当内存缓存满了的时候,就会往这里面放
(2)java.io.tmdir是操作系统缓存的临时目录,不同操作系统缓存目录不一样
<1>Windows: java.io.tmpdir:[C:\Users\登录用户~1\AppData\Local\Temp\]
<2>Linux: java.io.tmpdir: [/tmp]
<3>Mac OS X: java.io.tmpdir: [/tmp]
<4>Solaris: java.io.tmpdir:[/var/tmp/]