Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存有Hibernate自身管理,通常状况下不须要进行干预;第二级别的缓存是SessionFactory的缓存,它是属于进程范围或集群范围的缓存。这一级别的缓存能够进行配置和更改而且能够动态加载和卸载。Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级别的缓存。java
Hibernate提供的一级缓存数据库
hibernate是一个线程对应一个session,一个线程能够当作一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了。缓存
hibernate一级缓存生命周期很短,和session生命周期同样,一级缓存也称session级的缓存或事务级缓存。若是tb事务提交或回滚了,咱们称session就关闭了,生命周期结束了。session
一级缓存的管理:
evit(Object obj) 将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象.
clear() 将一级缓存中的全部持久化对象清除,释放其占用的内存资源
contains(Object obj) 判断指定的对象是否存在于一级缓存中.
flush() 刷新一级缓存区的内容,使之与数据库数据保持同步. 并发
二级缓存的管理:
evict(Class arg0, Serializable arg1) 将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源.
app
sessionFactory.evict(Customer.class, new Integer(1)); spa
evict(Class arg0) 将指定类的全部持久化对象从二级缓存中清除,释放其占用的内存资源.
.net
sessionFactory.evict(Customer.class);
evictCollection(String arg0) 将指定类的全部持久化对象的指定集合从二级缓存中清除,释放其占用的内存资源.
sessionFactory.evictCollection("Customer.orders");
Hibernate的二级缓存的配置
二级缓存须要sessionFactory来管理,它是进初级的缓存,全部人均可以使用,它是共享的。
首先,不是全部的数据都适合放在二级缓存中,看一下,什么样的数据适合放在二级缓存中来?什么样的数据不适合放在二级缓存中来?
下面这几种状况就不适合加载到二级缓存中:
1.常常被修改的数据
2.绝对不容许出现并发访问的数据
3.与其余应用共享的数据
下面这己种状况合适加载到二级缓存中:
1.数据更新频率低
2.容许偶尔出现并发问题的非重要数据
3.不会被并发访问的数据
4.常量数据
5.不会被第三方修改的数据
Hibernate的二级缓存功能是靠配置二级缓存插件来实现的,Hibernate为了集成这些插件,Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器 .
经常使用的二级缓存插件
EHCache org.hibernate.cache.EhCacheProvider
OSCache org.hibernate.cache.OSCacheProvider
SwarmCahe org.hibernate.cache.SwarmCacheProvider
JBossCache org.hibernate.cache.TreeCacheProvider
简单介绍一下EHCache的配置
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- 设置二级缓存插件EHCache的Provider类-->
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!-- 启动"查询缓存" -->
<property name="hibernate.cache.use_query_cache">
true
</property>
</session-factory>
</hibernate-configuration>
ehcache.xml
<ehcache>
<!-- maxElementsInMemory为缓存对象的最大数目, eternal设置是否永远不过时,timeToIdleSeconds对象处于空闲状态的最多秒数,timeToLiveSeconds对象处于缓存状态的最多秒数 -->
<diskStore path="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/>
</ehcache>
****.hbm.xml
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class>
<!-- 设置该持久化类的二级缓存并发访问策略 read-only read-write nonstrict-read-write transactional-->
<cache usage="read-write"/>
</class>
</hibernate-mapping>