缓存的概念
计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据是存储源总的数据的拷贝。缓存的物理介质通常是内存。
Hibernate中提供了两个级别的缓存
Session级别的缓存
它是属于事务范围的缓存。这一级别的缓存有Hibernate管理的,一般情况下午需进行干预。
SessionFactory级别的缓存
它是属于进程范围的缓存
启用二级缓存的条件
很少被修改
很多系统模块都要用到
不是私有的数据,是共享的
配置二级缓存
1、 拷贝ehcache-1.5.0.jar到当前工程的lib目录下
2、 开启二级缓存
3、 要指定缓存的供应商
<property name=”hibernate.cache.provider_class”>org.hibernate.cache.EhCacheProvider</property>
4、 指定使用二级缓存的类
方法一 在使用类的*.hbm.xml配置
选择需要使用二级缓存的持久化类,设置它的二级缓存的兵法访问策略,<class>元素的cache子元素表明Hibernate会缓存对象的简单属性,但不会缓存集合属性,若希望缓存集合属性中的元素,必须在<set>元素中加入<cache>子元素
<class name=”cn.itcast.c3p0.Customer” table=”customers” lazy=”false”>
<!—配置类级别的二级缓存à
<cache usage=”read-write”/>
<set name=”orders” table=”orders” inverse=”true” fetch=”select” lazy=”false”>
<!—配置集合级别的二级缓存à
<cache usage=”read-write”/>
方法二 在hibernate.cfg.xml文件中配置(建议)
<!—指定使用二级缓存的类,放在maping下面à
<!---配置类级别的二级缓存-->
<class-cache class=”cn.itcast.c3p0.Customer” usage=”read-write”/>
<class-cache class=”cn.itcast.c3p0.Order” usage=”read-write”/>
<!—配置集合级别的二级缓存à
<collection-cache collection=”cn.itcast.c3p0.Customer.orders” usage=”read-write”/>
<diskStore path=”D:\cache”/>
<cache name=””
maxElementsInMemory=”100”
eternal=”false”
timeToIdleSeconds=”300”
timeToLiveSeconds=”600”
overflowToDisk=”true”
diskPersistent=”false”/>
</ehcache>
<diskStore path=”C:\\TEMP”/>:如果内存中的数据已经达到所要求存放的最大值的时候。这个时候,其他的数据将会以文件的形式存放到磁盘上。
<defaultCache>设置缓存的默认数据过期策略
<cache>设定具体的命名缓存的数据过期策略
每个命名缓存代表一个缓存区域,每个缓存区域有各自的数据过期策略。命名缓存机制使得用户能够在每个类以及类的每个集合的粒度上设置过期策略。
cache元素的属性
name:设置缓存的名字,它的取值为类的全限定名或类的集合的名字
maxElementsInMemory:设置基于内存的缓存中可存放的对象最大数目
eternal:设置对象是否为永久的,true表示永不过期,此时将忽略
timeToIdleSeconds:设置对象空闲最长时间,以秒为单位,超过这个时间,对象过期。当对象过期是,EHCache会把它从缓存中清空。如果此值为0,表示对象可以无限期地处于空闲状态。
TimeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。如果此值为0,表示对象可以无限期地存在缓存中,该属性必须大于或等于timeToIdleSeconds属性值。
OverflowToDisk:设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到硬盘的缓存中。
diskPersistent当jvm结束时是否持久化对象true false默认是false
diskExpiryThreadIntervalSeconds指定专门用于清除过期对象的监听线程的轮询时间。