j2ee页面静态化方案encache web cache框架详解1

web caching

 

1.介绍

Ehcache Web 是 EhCache 缓存框架的一个组件,主要用于Java开发Web项目中的一些缓存功能。包括一个单页缓存过滤器:SimplePageCachingFilter;页面压缩(gzip)支持;页面片段缓存等功能。在某些情况下能够很好的提高web应用的性能。

 

2.simplePageCachingFilter

   能够缓存httpresponse的html,json,xml等输出的完整页面或者页面片段的缓存,也支持gzipping的页面缓存。页面片段缓存可以参考SimplePageFragmentCachingFilter类。

 

3.keys 缓存的key值

   缓存的key是依赖的查询url和query查询参数串,比如/admin/SomePage.jsp?id=1234&name=Beagle。不依赖于url的域名和端口号,所以对于绑定多个域名的同一台机器也是有效地。但是如果url加了一些为了跟踪用户行为用的序列生成的id号,则无法使用缓存。在这种情况下你也可以重写calculateKey(javax.servlet.http.HttpServletRequest)这个方法来定义自己缓存的key。

 

4.多线程并发缓存失效问题

   为了避免多线程并发导致cache失效之类的问题,可以通过设置init-param的 blockingTimeoutMillis参数,指定第一个获得锁的线程的超时时间,避免后续请求阻塞。

 

5.gzipping

  浏览器如果支持Accept-Encoding: gzip,则在缓存中直接取出gzip的response结果,如果浏览器不支持,则cache会通过高效的ungzipped之后把结果输出到response上。

 

6.caching headers

  SimpleCachingHeadersPageCachingFilter 这个类能够缓存http请求 headers的ETag, Last-Modified 和Expires字段,支持get请求。这样是为了让浏览器快速获取某个页面是否浏览器缓存失效问题。

 

7.web。xml中可以设置的 init-params
  • cacheName -ehcache.xml 用户设置的filter的cache名称
  • blockingTimeoutMillis - the time, in milliseconds, to wait for the filter chain to return with a response on a cache miss. This is useful to fail fast in the event of an infrastructure failure.
  • varyHeader - set to true to set Vary:Accept-Encoding in the response when doing Gzip. This header is needed to support HTTP proxies however it is off by default.
 8.SimplePageFragmentCacheingFilter

 

跟simplePageCachingFilter差不多,不过不支持gzip,这样才能对多个页面进行合并。

 

9.web.xml的配置

   <web-app xmlns="http://java.sun.com/xml/ns/javaee"

Xml代码   收藏代码
  1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  3. version="2.5">  
  4.   
  5.  <filter>  
  6. <filter-name>CachePage1CachingFilter</filter-name>  
  7. <filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter  
  8. </filter-class>  
  9. <init-param>  
  10.  <param-name>suppressStackTrace</param-name>  
  11.  <param-value>false</param-value>  
  12. </init-param>  
  13. <init-param>  
  14.  <param-name>cacheName</param-name>  
  15.  <param-value>CachePage1CachingFilter</param-value>  
  16. </init-param>  
  17.  </filter>  
  18.   
  19.  <filter>  
  20. <filter-name>SimplePageFragmentCachingFilter</filter-name>    <filter-class>net.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilter  
  21. </filter-class>  
  22. <init-param>  
  23.  <param-name>suppressStackTrace</param-name>  
  24.  <param-value>false</param-value>  
  25. </init-param>  
  26. <init-param>  
  27.  <param-name>cacheName</param-name>  
  28.  <param-value>SimplePageFragmentCachingFilter</param-value>  
  29. </init-param>  
  30.  </filter>  
  31.   
  32.  <filter>  
  33. <filter-name>SimpleCachingHeadersPageCachingFilter</filter-name>    <filter-class>net.sf.ehcache.constructs.web.filter.SimpleCachingHeadersPageCachingFilter  
  34. </filter-class>  
  35. <init-param>  
  36.  <param-name>suppressStackTrace</param-name>  
  37.  <param-value>false</param-value>  
  38. </init-param>  
  39. <init-param>  
  40.  <param-name>cacheName</param-name>  
  41.  <param-value>CachedPage2Cache</param-value>  
  42. </init-param>  
  43.  </filter>  
  44.   
  45.  <!-- This is a filter chain. They are executed in the order below.  
  46.       Do not change the order. -->  
  47.   
  48.  <filter-mapping>  
  49. <filter-name>CachePage1CachingFilter</filter-name>  
  50. <url-pattern>/CachedPage.jsp</url-pattern>  
  51. <dispatcher>REQUEST</dispatcher>  
  52. <dispatcher>INCLUDE</dispatcher>  
  53. <dispatcher>FORWARD</dispatcher>  
  54.  </filter-mapping>  
  55.   
  56.  <filter-mapping>  
  57. <filter-name>SimplePageFragmentCachingFilter</filter-name>  
  58. <url-pattern>/include/Footer.jsp</url-pattern>  
  59.  </filter-mapping>  
  60.   
  61.  <filter-mapping>  
  62. <filter-name>SimplePageFragmentCachingFilter</filter-name>  
  63. <url-pattern>/fragment/CachedFragment.jsp</url-pattern>  
  64.  </filter-mapping>  
  65.   
  66.  <filter-mapping>  
  67. <filter-name>SimpleCachingHeadersPageCachingFilter</filter-name>  
  68. <url-pattern>/CachedPage2.jsp</url-pattern>  
  69.  </filter-mapping>  
  10.ehcache.xml的配置

   <Ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

Xml代码   收藏代码
  1. xsi:noNamespaceSchemaLocation="../../main/config/ehcache.xsd">  
  2. <diskStore path="java.io.tmpdir"/>  
  3.  <defaultCache  
  4.    maxEntriesLocalHeap="10"  
  5.    eternal="false"  
  6.    timeToIdleSeconds="5"  
  7.    timeToLiveSeconds="10"  
  8.    overflowToDisk="true"  
  9.    />  
  10.   <!-- Page and Page Fragment Caches -->  
  11. <cache name="CachePage1CachingFilter"  
  12.   maxEntriesLocalHeap="10"  
  13.   eternal="false"  
  14.   timeToIdleSeconds="10000"  
  15.   timeToLiveSeconds="10000"  
  16.   overflowToDisk="true">  
  17. </cache>  
  18. <cache name="CachedPage2Cache"  
  19.   maxEntriesLocalHeap="10"  
  20.   eternal="false"  
  21.   timeToLiveSeconds="3600"  
  22.   overflowToDisk="true">  
  23. </cache>  
  24. <cache name="SimplePageFragmentCachingFilter"  
  25.   maxEntriesLocalHeap="10"  
  26.   eternal="false"  
  27.   timeToIdleSeconds="10000"  
  28.   timeToLiveSeconds="10000"  
  29.   overflowToDisk="true">  
  30. </cache>  
  31. <cache name="SimpleCachingHeadersTimeoutPageCachingFilter"  
  32.   maxEntriesLocalHeap="10"  
  33.   eternal="false"  
  34.   timeToIdleSeconds="10000"  
  35.   timeToLiveSeconds="10000"  
  36.   overflowToDisk="true">  
  37. </cache>  
  38. </ehcache>  

 

11.caching filter的异常

FilterNonReentrantException 当同一个线程再次重入caching filter处理时抛出异常,因为当第一个请求还未block时,同一个线程再次进入该filter就会block

ResponseHeadersNotModifiableException类似FilterNonReentrantException 

AlreadyGzippedException 如果已经对一个页面进行gzip处理,再次gzip时就抛出该异常

ResponseHeadersNotModifiableException如果对页面进行gzip处理,那么需要重新设置setheader的值,如果在设置过程中出错了,则抛出该异常。

 

参考:http://www.ehcache.org/documentation/user-guide/web-caching

 

对源码实现欢迎参考 http://zhwj184.iteye.com/blog/1545157

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值