asdtiang的博客 感谢blogjava提供的博客交流平台

s2sh项目整合ehcache页面缓存

Posted on 2011-03-08 15:23 asdtiang 阅读(2500) 评论(0)  编辑  收藏 所属分类: java ee
网上用ehcache做对象缓存和数据库缓存的比较多。但仔细一想,直接做页面缓存显然更好,直接点不用绕路。
本人用的是s2sh开发网站,整合了urlrewrite.其实最后页面路径配置时也是用的struts2的路径。
网上的比较多的就是直接给出配置文件。

首先网上查了下,ehcache和oscache,上相应的官网查看,发现oscache到07年以后就没更新过,不知道是改名字了,还是其它原因,最后采用了ehcache做页面缓存

配置可以参考官方页面:http://ehcache.org/documentation/web_caching.html

web里面配置如下:
 <filter>
    
<filter-name>CachePage1CachingFilter</filter-name>
    
<filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter
    
</filter-class>
    
<init-param>
      
<param-name>suppressStackTraces</param-name>
      
<param-value>false</param-value>
    
</init-param>
    
<init-param>
      
<param-name>cacheName</param-name>
      
<param-value>CachePage1CachingFilter</param-value>
    
</init-param>
  
</filter>

  
<filter>
    
<filter-name>SimplePageFragmentCachingFilter</filter-name>
    
<filter-class>net.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilter
    
</filter-class>
    
<init-param>
      
<param-name>suppressStackTraces</param-name>
      
<param-value>false</param-value>
    
</init-param>
    
<init-param>
      
<param-name>cacheName</param-name>
      
<param-value>SimplePageFragmentCachingFilter</param-value>
    
</init-param>
  
</filter>

  
<filter>
    
<filter-name>SimpleCachingHeadersPageCachingFilter</filter-name>
    
<filter-class>net.sf.ehcache.constructs.web.filter.SimpleCachingHeadersPageCachingFilter
    
</filter-class>
    
<init-param>
      
<param-name>suppressStackTraces</param-name>
      
<param-value>false</param-value>
    
</init-param>
    
<init-param>
      
<param-name>cacheName</param-name>
      
<param-value>CachedPage2Cache</param-value>
    
</init-param>

  
</filter>

  
<!-- This is a filter chain. They are executed in the order below.
  Do not change the order. 
-->
  
<filter-mapping>
    
<filter-name>CachePage1CachingFilter</filter-name>
    
<url-pattern>/CachedPage.jsp</url-pattern>
    
<dispatcher>REQUEST</dispatcher>
    
<dispatcher>INCLUDE</dispatcher>
    
<dispatcher>FORWARD</dispatcher>
  
</filter-mapping>

  
<filter-mapping>
    
<filter-name>SimplePageFragmentCachingFilter</filter-name>
    
<url-pattern>/include/Footer.jsp</url-pattern>
  
</filter-mapping>

  
<filter-mapping>
    
<filter-name>SimplePageFragmentCachingFilter</filter-name>
    
<url-pattern>/fragment/CachedFragment.jsp</url-pattern>
  
</filter-mapping>

  
<filter-mapping>
    
<filter-name>SimpleCachingHeadersPageCachingFilter</filter-name>
    
<url-pattern>/CachedPage2.jsp</url-pattern>
  
</filter-mapping>
ehcache.xml文件要放在src下面。
<Ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation
="../../main/config/ehcache.xsd">

    
<diskStore path="java.io.tmpdir"/>


    
<defaultCache
            
maxElementsInMemory="10"
            eternal
="false"
            timeToIdleSeconds
="5"
            timeToLiveSeconds
="10"
            overflowToDisk
="true"
            
/>



    
<!-- Page and Page Fragment Caches -->

    
<cache name="CachePage1CachingFilter"
           maxElementsInMemory
="10"
           eternal
="false"
           timeToIdleSeconds
="10000"
           timeToLiveSeconds
="10000"
           overflowToDisk
="true">
    
</cache>

    
<cache name="CachedPage2Cache"
           maxElementsInMemory
="10"
           eternal
="false"
           timeToLiveSeconds
="3600"
           overflowToDisk
="true">
    
</cache>

    
<cache name="SimplePageFragmentCachingFilter"
           maxElementsInMemory
="10"
           eternal
="false"
           timeToIdleSeconds
="10000"
           timeToLiveSeconds
="10000"
           overflowToDisk
="true">
    
</cache>

    
<cache name="SimpleCachingHeadersTimeoutPageCachingFilter"
           maxElementsInMemory
="10"
           eternal
="false"
           timeToIdleSeconds
="10000"
           timeToLiveSeconds
="10000"
           overflowToDisk
="true">
    
</cache>

</ehcache>

现在的问题是有些页面要更新,在内存或者硬盘上的数据需要更新,而且是实时的。应该怎么办,网上多的也是对象的操作,基本没有缓存页面的操作。
首先说下缓存页面的大概方法。
ehcache.xml里面对应web.xml,name都一样的,比如一个具体路径,show.action?showId=1,配置如下:
 <filter-mapping>
    <filter-name>show</filter-name>
   <url-pattern>/show.action</url-pattern>
  </filter-mapping>
取前面的部分就可以了。对应ehcache.xml配置:

<!--

            maxElementsInMemory="10"内存中的最大页面对象
            eternal="false"
            timeToIdleSeconds="120"   timeToIdleSeconds ,多长时间不访问该缓存,那么ehcache 就会清除该缓存。           
            timeToLiveSeconds="240" timeToLiveSeconds ,缓存的存活时间,从开始创建的时间算起。
            overflowToDisk="true"     是否写入硬盘


-->
    <!-- Page and Page Fragment Caches -->

    <cache name="show"
           maxElementsInMemory="10"
           eternal="false"
           timeToIdleSeconds="30"
           timeToLiveSeconds="60"
           overflowToDisk="true">
    </cache>

这里只有一个cache,在ehcache即对应一个Ehcache对象,由CacheManager(单例模式实现)去管理,在CacheManager里用配置文件中的name可以获取Ehcache对象的实例。
代码如下:
Ehcache cache = CacheManager.getInstance().getEhcache(cacheName);

展示页面有很多,比如一个商家一个展示页面,即show.action?showId=1后面的数字是可变的,在ehcache里面是用map去存储的,比如show.action?showId=1对应的key为:
GET/show.actionshowId=1
GET为访问方式,把问号去掉了,ehcache内部也是这样存储的(类似map),这样保证了请求的页面在内存中的唯一性,获取也快。
既然key都知道了,删除就好了,直接 查看api文档Ehcache里有很多remove方法。示例代码如下:
Ehcache cache = CacheManager.getInstance().getEhcache(cacheName);
  if (null == cache) {
   return;
  }
  cache.remove(key);

key的获取就不用多说了吧,当更新一个页面的数据时,肯定知道数据的id,直接字符串处理下就可以获取key了,这里注意下就是,代码编写时,一般url里都有项目的名字,正式发布时,肯定没有,而前者在ehcache里生成key里有项目的名字,即:
GET/projetName/show.actionshowId=1
所以最好用spring注入值,到时改也方便。

更详细的,请查看api文档和测试下,官方文档给的都是对象的,页面缓存的给的比较少,我也是查看源码才得出上面代码。
记一下,希望帮助有需求的人。




天苍苍,野茫茫,风吹草底见牛羊

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 80, comments - 24, trackbacks - 0, articles - 32

Copyright © asdtiang

asdtiang的博客 PaidMailz
点击广告网赚A(每天4个广告,每个0.0025美元,一个搜索广告0.03美元)