Hibernate中Ehcache缓存的配置

一、EhCache简介

EHCache 是一个非常轻量级的缓存实现,是一个纯Java的进程内缓存框架,而且从1.2 之后就支持了集群,是Hibernate中默认的CacheProvider。具有快速、精干等特点。Ehcache可以直接使用,也可以和Hibernate对象/关系框架结合使用。可以将对象、数据、jsp、Servlet进行缓存。

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

二、配置

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

Ehcache 对象、数据缓存:http://ehcache.org/downloads/destination?name=ehcache-core-2.5.2-distribution.tar.gz&bucket=tcdistributions&file=ehcache-core-2.5.2-distribution.tar.gz

Web页面缓存:http://ehcache.org/downloads/destination?name=ehcache-web-2.0.4-distribution.tar.gz&bucket=tcdistributions&file=ehcache-web-2.0.4-distribution.tar.gz

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

<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>

3、需要在映射文件*.hbm.xml中<class name="" table="" > 节点下添加如下内容:

<!-- 缓存策略 -->
<cache usage="read-write"/>

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

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

 <!-- 数据缓存存放目录 -->
  <diskStore path="/jcms_cache_data/ehcache"/>
  <!-- 页面缓存,三种缓存算法:LRU-最近最少使用、LFU-较少频率使用和FIFO-先进先出。

  参数详解:

   simplePageCachingFilter 缓存的名称
   maxElementsInMemory 缓存中元素的最大数量
   maxElementsOnDisk 持久化到硬盘的缓存元素的最大数量
   eternal="false"  如果为true,表示对象永远不会过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false;
   overflowToDisk="true" 当缓存中元素数量超过限制时,将这些元素持久化到硬盘,为false时,设置没意义。
   timeToIdleSeconds 多长时间不访问缓存,那么就清除该缓存
   timeToLiveSeconds 缓存的存活时间
   -->
  <cache name="SimplePageCachingFilter" 
         maxElementsInMemory="10000" 
         maxElementsOnDisk="1000" 
         eternal="false" 
         overflowToDisk="true" 
         timeToIdleSeconds="5" 
         timeToLiveSeconds="30" 
         memoryStoreEvictionPolicy="LFU"/>
  
  <!-- Ehcache 对象、数据缓存用以下配置 -->
  <defaultCache  maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        diskSpoolBufferSizeMB="30"
        maxElementsOnDisk="10000000"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120"/>
</ehcache>

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

<!-- Ehcache页面缓存配置 -->
   <filter> 
     <filter-name>PageCacheFilter</filter-name> 
        <filter-class>net.cnki.tpi.cms.util.PageCacheFilter</filter-class> 
        <!-- 初始化参数为无需缓存的URL,多个以逗号分隔 -->
        <init-param>
         <param-name>notCacheUrlList</param-name>
         <param-value>/jcms/pcons/getUserManager.action</param-value>
        </init-param>
   </filter> 
  <filter-mapping> 
     <filter-name>PageCacheFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
  </filter-mapping>

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

 

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 notCacheUrlList = filterConfig.getInitParameter(NOT_CACHE_URL_LIST);
		 if(!MyStringUtil.isNullOrEmpty(notCacheUrlList)){
			 notCacheURLs = notCacheUrlList.split(",");    
		 }
	}
	
	 @Override   
	 protected void doFilter(final HttpServletRequest request,final HttpServletResponse response, final FilterChain chain)throws AlreadyGzippedException, AlreadyCommittedException,FilterNonReentrantException, LockTimeoutException, Exception
	 {
		 if (notCacheURLs == null) { 
			 init();
		 }
		 String request_url = request.getRequestURI();     
		 boolean flag = false;
		 
		 if (notCacheURLs != null && notCacheURLs.length > 0) {     
			 for (String notCacheURL : notCacheURLs) {          
				 if (request_url.contains(notCacheURL.trim())) {          
					 flag = true;           
					 break;             
				 }          
			 }      
		 }
		 //如果请求的url为不需要缓存的,则执行正常页面转向;否则缓存该页面
		 if (flag) {         
			 chain.doFilter(request, response);  
		}else{          
			 String query = request.getQueryString();  
			 if (query != null) {        
				 query = "?" + query;          
			 }            
			 log.info("当前请求被缓存:" + request_url + query);       
			 super.doFilter(request, response, chain);
		}
	 }
	 
	 @SuppressWarnings("unchecked")
	  private boolean headerContains(final HttpServletRequest request, final String header, final String value) {
		 logRequestHeaders(request);       
		 final Enumeration accepted = request.getHeaders(header); 
		 while (accepted.hasMoreElements()) {          
			 final String headerValue = (String) accepted.nextElement();   
			 if (headerValue.indexOf(value) != -1) {             
				 return true;          
				 }      
			 }        
		 return false;   
	 }
	 
	 @Override    
	 protected boolean acceptsGzipEncoding(HttpServletRequest request) {  
		 boolean ie6 = headerContains(request, "User-Agent", "MSIE 6.0");   
		 boolean ie7 = headerContains(request, "User-Agent", "MSIE 7.0"); 
		 return acceptsEncoding(request, "gzip") || ie6 || ie7;    
	 }
}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值