二级缓存介绍:二级缓存也称为进程级的缓存或SessionFactory级的缓存,可以被所有的session共享。二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
二级缓存的配置和使用:
- 配置ehcache.xml文件
在此文件中,可以设置缓存中最多可容纳的对象数量,设置超时时间、设置对象的存活时间、当二级缓存溢出时,对象保存的位置等等。可以根据具体的对象进行具体的设置。
<!-- 缺省配置,所有的类都默认遵循的配置 -->
<defaultCache
maxElementsInMemory="10000" <!-- 缓存中的对象数量 -->
eternal="false" <!-- 设置该二级缓存的对象是否永久存活,一般设置成false,防止数据库变动时出现数据不同步的错误,另外,为新增加近缓存的对象节省空间。 -->
timeToIdleSeconds="120" <!-- 在一定时间内如果没有被调用,则对象将自动在缓存当中被清除。 -->
timeToLiveSeconds="120" <!-- 对象在缓存中的最大存活时间,为了与数据库中的数据保持同步。 -->
overflowToDisk="true" <!-- 超出maxElementsInMemory设置的1000个对象时,是否保存到磁盘上。磁盘上的路径在diskStore中设置。 -->
/>
<diskStore path="java.io.tmpdir"/>
- 在hibernate.cfg.xml文件中加入缓存产品提供商
<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
- 启用二级缓存,这也是它的默认配置
<propertyname="hibernate.cache.use_second_level_cache">true</property>
- 指定哪些实体类使用二级缓存
可以在映射文件中采用<cache>标签指定或在hibernate.cfg.xml文件中用<class-cache>统一指定。在hibernate.cfg.xml中配置的优势是,可以很快速的看到设置了那些对象支持二级缓存。
<!-- 在hibernate.cfg.xml文件中配置 -->
<class-cache class="com.ls.Student" usage="read-only"/>
--------------------------------------------
<!-- 映射文件中的配置 -->
<cache usage="read-only"/>
usage为缓存使用策略,通常采用read-only和read-write。
read-only用于适用于不变的数据,使用read-onyl可以提高效率,因为只允许读,避免了修改带来的维护的复杂性。但是,同时也存在缺点,如果更新了数据库,在缓存超时之前,缓存里数据仍然是不变的,这样就会出现脏数据。
read-write需要通过锁机制来保证数据的准确性。
二级缓存和一级缓存一样,主要是缓存实体对象的,对普通属性不进行缓存。什么时候适合使用二级缓存?: 一些确定需要经常访问的对象、 数据量并不大的情况、改动非常少的对象。
一级缓存和二级缓存的交互
一级缓存和二级缓存的交互,通过session.setCacheMode(CacheMode.get/put/normal/ingore)方法来控制。
CacheMode.get:一级缓存可以读取二级缓存中的数据
CacheModel.put:一级缓存里的数据可以写入二级缓存中
CacheModel.normal:可以进行读写操作,此参数为默认
CacheModel.ignore:禁止一级缓存和二级缓存的交互
大批量数据更新时,如果配置了二级缓存建议禁用一级缓存和二级缓存的交互,这样,通过禁止存入二级缓存,通过清理一级缓存,达到减少内存占用的目的。