hibernate二级缓存 Ehcache配置详解(一)

2014-11-24 09:49:35 · 作者: · 浏览: 0

一、hibernate缓存简介

一级缓存(session):内部缓存
事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。

二级缓存(sessionFactory):
缓存被应用范围内的所有事务共享。 这些事务有可能是并发访问缓存,因此必须对缓存进行更新。缓存的生命周期依赖于应用的生命周期,应用结束时, 缓存也就结束了生命周期,二级缓存存在于应用范围。集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性, 缓存中的数据通常采用对象的松散数据形式,二级缓存也存在与应用范围。

注意:对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,再加上集群范围还有数据同步的问题,所以应当慎用。多种范围的缓存处理过程持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到应用范围或集群范围的缓存内查询,如果还是没有查到,那么只有到数据库中查询了。

使用二级缓存的原则:
◆数据不会被第三方修改
◆同一数据系统经常引用
◆数据大小在可接受范围之内
◆关键数据或不会被并发更新的数据

二、EhCache简介

EHCache 是一个非常轻量级的缓存实现,是一个纯Java的进程内缓存框架,而且从1.2 之后就支持了集群,是Hibernate中默认的CacheProvider。

具有快速、精干等特点,Ehcache可以直接使用。

也可以和Hibernate对象/关系框架结合使用。可以将对象、数据、jsp、Servlet进行缓存。

Cache 存储方式 :内存或磁盘。

三、配置

1、首先到官网下载ehcache-core.jar、ehcache-web.jar最新版本,然后加入所在工程的lib中

2、在hibernate的相关配置中添加如下:

true
true
org.hibernate.cache.EhCacheProvider
/ehcache.xml

3、需要在映射文件*.hbm.xml中 节点下添加如下:


4、在src根目录下加入ehcache.xml文件,具体内容如下:

< xml version="1.0" encoding="UTF-8" >




maxElementsInMemory="10000"
maxElementsOnDisk="1000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="5"
timeToLiveSeconds="30"
memoryStoreEvictionPolicy="LFU"/>


eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskSpoolBufferSizeMB="30"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"/>

5、web.xml中加入以下配置:



PageCacheFilter
net.cnki.tpi.cms.util.PageCacheFilter


notCacheUrlList
/jcms/pcons/getUserManager.action



PageCacheFilter
/*

5、写一个Filter,继承SimplePageCachingFilter,如下:

[java]


package net.cnki.tpi.cms.util;
import java.util.Enumeration;

import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.ehcache.CacheException;
import net.sf.ehcache.constructs.blocking.LockTimeoutException;
import net.sf.ehcache.constructs.web.AlreadyCommittedException;
import net.sf.ehcache.constructs.web.AlreadyGzippedException;
import net.sf.ehcache.constructs.web.filter.FilterNonReentrantException;
import net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter;

import org.apache.log4j.Logger;

public class PageCacheFilter extends SimplePageCachingFilter {
private final static Logger log = Logger.getLogger(PageCacheFilter.class);
private final static String NOT_CACHE_URL_LIST = "notCacheUrlList";
private static String[] notCacheURLs;

private void init() throws CacheException {
String notCac