??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲第一永久AV网站久久精品男人的天堂AV ,相泽亚洲一区中文字幕,亚洲精品国产高清嫩草影院http://m.tkk7.com/libin2722/category/37910.html虚其心,可解天下之问Q专其心Q可d下之学;静其心,可悟天下之理Q恒其心Q可成天下之业?/description>zh-cnWed, 20 Nov 2013 14:15:17 GMTWed, 20 Nov 2013 14:15:17 GMT60Ehcache详细解读http://m.tkk7.com/libin2722/articles/406569.htmlC物C物Wed, 20 Nov 2013 04:53:00 GMThttp://m.tkk7.com/libin2722/articles/406569.htmlhttp://m.tkk7.com/libin2722/comments/406569.htmlhttp://m.tkk7.com/libin2722/articles/406569.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/406569.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/406569.html阅读全文

C物 2013-11-20 12:53 发表评论
]]>
ehcache 配置参数说明http://m.tkk7.com/libin2722/articles/404115.htmlC物C物Mon, 16 Sep 2013 02:43:00 GMThttp://m.tkk7.com/libin2722/articles/404115.htmlhttp://m.tkk7.com/libin2722/comments/404115.htmlhttp://m.tkk7.com/libin2722/articles/404115.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/404115.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/404115.html <   ehcache       xmlns:xsi   =   "http://www.w3.org/2001/XMLSchema-instance"          xsi:noNamespaceSchemaLocation   =   "ehcache.xsd"   >       
     <   diskStore       path   =   "java.io.tmpdir"   />       
     <   defaultCache       
       maxElementsInMemory   =   "10000"       
       maxElementsOnDisk   =   "0"       
       eternal   =   "true"       
       overflowToDisk   =   "true"       
       diskPersistent   =   "false"       
       timeToIdleSeconds   =   "0"       
       timeToLiveSeconds   =   "0"       
       diskSpoolBufferSizeMB   =   "50"       
       diskExpiryThreadIntervalSeconds   =   "120"       
       memoryStoreEvictionPolicy   =   "LFU"       
       />       
     <   cache       name   =   "myCache"       
       maxElementsInMemory   =   "100"       
       maxElementsOnDisk   =   "0"       
       eternal   =   "false"       
       overflowToDisk   =   "false"       
       diskPersistent   =   "false"       
       timeToIdleSeconds   =   "120"       
       timeToLiveSeconds   =   "120"       
       diskSpoolBufferSizeMB   =   "50"       
       diskExpiryThreadIntervalSeconds   =   "120"       
       memoryStoreEvictionPolicy   =   "FIFO"       
       />       
</   ehcache   >
   
diskStore  Q指定数据存储位|,可指定磁盘中的文件夹位置
defaultCache Q?默认的管理策?/div>

以下属性是必须的:
  1. nameQ?/strong>  Cache的名Uͼ必须是唯一?ehcache会把q个cache攑ֈHashMap??/span>
  2. maxElementsInMemoryQ?/strong>   在内存中~存的element的最大数?span>?span class="Apple-converted-space"> 
  3. maxElementsOnDiskQ?/strong>   在磁盘上~存的element的最大数?span>Q默认gؓ0Q表CZ限制?span class="Apple-converted-space"> 
  4. eternalQ?/strong>   讑֮~存的elements是否永远不过期。如果ؓtrueQ则~存的数据始l有效,如果为false那么q要ҎtimeToIdleSecondsQtimeToLiveSeconds判断?span class="Apple-converted-space"> 
  5. overflowToDiskQ?/strong>  如果内存中数据超q内存限Ӟ是否要缓存到盘上?/span>

以下属性是可选的Q?/strong>  
  1. timeToIdleSecondsQ?/strong>  对象I闲旉Q指对象在多长时间没有被讉K׃失效。只对eternal为false的有效。默认?Q表CZ直可以访问?/span>
  2. timeToLiveSecondsQ?/strong>  对象存活旉Q指对象从创建到失效所需要的旉。只对eternal为false的有效。默认?Q表CZ直可以访问?/span>
  3. diskPersistentQ?/strong>  是否在磁盘上持久化。指重启jvm后,数据是否有效。默认ؓfalse?/span>
  4. diskExpiryThreadIntervalSecondsQ?/strong>  对象线E运行时间间隔。标识对象状态的U程多长旉q行一ơ?/span>
  5. diskSpoolBufferSizeMBQ?/strong>  DiskStore使用的磁盘大,默认?0MB。每个cache使用各自的DiskStore?/span>
  6. memoryStoreEvictionPolicyQ?/strong>  如果内存中数据超q内存限Ӟ向磁盘缓存时的策略。默认值LRUQ可选FIFO、LFU?/span>
~存? U清I策?/strong>  Q?br />FIFO Qfirst in first out (先进先出).

LFU Q?Less Frequently Used (最?.意思是一直以来最被使用的。缓存的元素有一个hit 属性,hit 值最的会被清出缓存?br />
LRU QLeast Recently Used(最q最?. (ehcache 默认?.~存的元素有一个时间戳Q当~存定w满了Q而又需要腾出地Ҏ~存新的元素的时候,那么现有~存元素中时间戳d前时间最q的元素被清出~存?span class="Apple-converted-space">


C物 2013-09-16 10:43 发表评论
]]>xmemcachedhttp://m.tkk7.com/libin2722/articles/335435.htmlC物C物Mon, 18 Oct 2010 04:07:00 GMThttp://m.tkk7.com/libin2722/articles/335435.htmlhttp://m.tkk7.com/libin2722/comments/335435.htmlhttp://m.tkk7.com/libin2722/articles/335435.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/335435.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/335435.htmlcom.googlecode.xmemcachedxmemcached1.2.5 单例? MemcachedClient client=new XMemcachedClient("host",11211); //同步存储value到memcached client.set("key",3600,someObject); //从memcached获取key对应的value Object someObject=client.get("key"); //从memcached获取key对应的value,操作时2U? someObject=client.get("key",2000); //删除value client.delete("key"); 讄权重 MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000 localhost:12001"),new int[]{1,3}); MemcachedClient memcachedClient=builder.build(); 上面的例子将"localhost:12000"节点的权重设|ؓ1Q而将"localhost:12001"节点的权重设|ؓ3.当然Q你也可以通过JMX调用MBean动态修Ҏ重: public interface XMemcachedClientMBean{ .... /** * Set a memcached server's weight * * @param server * @param weight */ public void setServerWeight(String server, int weight); } 使用二进制协? Xmemcached默认使用成熟的文本协议,memcached 1.4.0正式支持启用二进制协议,如果你想使用二进制协议,你只要添加一行代码,讄BinaryCommandFactory卛_Q? MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000 localhost:12001"),new int[]{1,3}); builder.setCommandFactory(new BinaryCommandFactory());//use binary protocol MemcachedClient memcachedClient=builder.build(); 使用Kestrel Kestrel是twitter开源的一个scala写的单高效MQQ它支持memcached文本协议Q但是ƈ不完全兼容,例如它不支持flagQ导致很多利用flag做序列化的客L无法正常q作。因此XmemcachedҎ提供了KestrelCommandFactory用于支持Kestrel。用KestrelCommandFactory卛_拥有如下好处Q? 默认关闭get优化Q因为kestrel不支持bulk getQ? 支持kestrel的阻塞获取和可靠获取Q? 允许向kestrel存储Ljava序列化类型。设|KestrelCommandFactory: MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000 localhost:12001"),new int[]{1,3}); builder.setCommandFactory(new KestrelCommandFactory()); MemcachedClient memcachedClient=builder.build(); 关于最后一炚w要补充说明,׃kestrel不支持flagQ因此xmemcached在存储的数据之前加了4个字节的flagQ如果你的全部应用都使用xmemcachedQ那么没有问题,如果使用其他clientsQ会有兼Ҏ的问题Q因此Xmemcachedq允许关闭这个功能,通过 client.setPrimitiveAsString(true); 讄为true后,原生cd都将存储为字W串Q而序列化cd无法存储了? 动态增删节? 你可以通过~程或者JMX来动态增加或者移除memcached节点Q? MemcachedClient client=new XMemcachedClient(AddrUtil.getAddresses("server1:11211 server2:11211")); //Add two new memcached nodes client.addServer("server3:11211 server4:11211"); //Remove memcached servers client.removeServer("server1:11211 server2:11211"); Nioq接? Xmemcached是基于java nio的client实现Q默认对一个memcached节点只有一个连接,q在通常情况下已l有非常优异的表现。但是在典型的高q发环境?nio的单q接也会遇到性能瓉。因此XMemcached支持讄nio的连接池Q允许徏立多个连接到同一个memcached节点Q但是请注意Q这些连接之间是不同步的Q因此你的应用需要自׃证数据更新的同步Q启用连接池可以通过下面代码Q? MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000")); builder.setConnectionPoolSize(5); 使用CAS原子更新 典型的CAS操作需要先通过gets得到cas|然后q行cas替换Q用h相当ȝ。XMemcached提供了CASOperation装了这两个操作Q提供给用户l一的用接口,q且允许讄最多重试次数。详见下面的例子Q启动N个线E原子更新同一个key的value? class CASThread extends Thread { static final class IncrmentOperation implements CASOperation { /* *Max repeat times.if repeat times is great than this value, *xmemcached will throw a TimeoutException. */ @Override public int getMaxTries() { return Integer.MAX_VALUE; } //increase current value @Override public Integer getNewValue(long currentCAS, Integer currentValue) { return currentValue + 1; // 当前?1 } } private XMemcachedClient mc; private CountDownLatch cd; public CASThread(XMemcachedClient mc, CountDownLatch cdl) { super(); this.mc = mc; this.cd = cdl; } public void run() { try { //do the cas operation if (mc.cas("a", 0, new IncrmentOperation())) this.cd.countDown(); } catch (Exception e) { e.printStackTrace(); } } } public class CASTest { public static void main(String[] args) throws Exception { if (args.length < 2) { System.err.println("Usage:java CASTest [threadNum] [server]"); System.exit(1); } //threads num int NUM = Integer.parseInt(args[0]); XMemcachedClient mc = new XMemcachedClient(AddrUtil.getAddresses(args[1])); //initial value is 0 mc.set("a", 0, 0); CountDownLatch cdl = new CountDownLatch(NUM); long start = System.currentTimeMillis(); //start NUM threads to increment the value for (int i = 0; i < NUM; i++) new CASThread(mc, cdl).start(); cdl.await(); System.out.println("test cas,timed:" + (System.currentTimeMillis() - start)); System.out.println("result=" + mc.get("a")); mc.shutdown(); } }

C物 2010-10-18 12:07 发表评论
]]>
用OSCacheq行~存对象http://m.tkk7.com/libin2722/articles/328319.htmlC物C物Mon, 09 Aug 2010 07:57:00 GMThttp://m.tkk7.com/libin2722/articles/328319.htmlhttp://m.tkk7.com/libin2722/comments/328319.htmlhttp://m.tkk7.com/libin2722/articles/328319.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/328319.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/328319.html 1、OSCache是什?
     OSCache标记库由OpenSymphony设计Q它是一U开创性的~存ҎQ它提供了在现有JSP面之内实现内存~存的功能。OSCache是个 一个被q泛采用的高性能的J2EE~存框架QOSCacheq能应用于Q何Java应用E序的普通的~存解决Ҏ?br />2、OSCache的特?/strong>
    (1) ~存M对象Q你可以不受限制的缓存部分jsp面或HTTPhQQ何java对象都可以缓存?br />    (2) 拥有全面的APIQOSCache API允许你通过~程的方式来控制所有的OSCacheҎ?
    (3) 怹~存Q缓存能被配|写入硬盘,因此允许在应用服务器的多ơ生命周期间~存创徏开销昂贵的数据?
    (4) 支持集群Q集缓存数据能被单个的q行参数配置Q不需要修改代码?br />    (5) ~存q期Q你可以有最大限度的控制~存对象的过期,包括可插入式的刷新策略(如果默认性能不能满需要时Q?br />3、OSCache的安装与配置
    |上已经有一个不错的使用教程Q?a target="_blank">http://blog.csdn.net/ezerg/archive/2004/10/14/135769.aspx
4、有关“用OSCacheq行~存对象”的研究
    q个是我今天要说的东ѝ网上对于OSCache~存Web面很多说明和例子,但对于缓存对象方面说得不多,我就把自已写得一些东西放出来Q让大家看一看是怎样~存对象?
    我基于GeneralCacheAdministratorcL写的BaseCachec?br />   

  1. package  com.klstudio.cache;   
  2.   
  3. import  java.util.Date;   
  4.   
  5. import  com.opensymphony.oscache.base.NeedsRefreshException;   
  6. import  com.opensymphony.oscache.general.GeneralCacheAdministrator;   
  7.   
  8. public   class  BaseCache  extends  GeneralCacheAdministrator {   
  9.      //q期旉(单位为秒);   
  10.      private   int  refreshPeriod;   
  11.      //关键字前~字符;   
  12.      private  String keyPrefix;   
  13.        
  14.      private   static   final   long  serialVersionUID = -4397192926052141162L;   
  15.        
  16.      public  BaseCache(String keyPrefix, int  refreshPeriod){   
  17.          super ();   
  18.          this .keyPrefix = keyPrefix;   
  19.          this .refreshPeriod = refreshPeriod;   
  20.     }   
  21.      //d被缓存的对象;   
  22.      public   void  put(String key,Object value){   
  23.          this .putInCache( this .keyPrefix+ "_" +key,value);   
  24.     }   
  25.      //删除被缓存的对象;   
  26.      public   void  remove(String key){   
  27.          this .flushEntry( this .keyPrefix+ "_" +key);   
  28.     }   
  29.      //删除所有被~存的对?   
  30.      public   void  removeAll(Date date){   
  31.          this .flushAll(date);   
  32.     }   
  33.        
  34.      public   void  removeAll(){   
  35.          this .flushAll();   
  36.     }   
  37.      //获取被缓存的对象;   
  38.      public  Object get(String key)  throws  Exception{   
  39.          try {   
  40.              return   this .getFromCache( this .keyPrefix+ "_" +key, this .refreshPeriod);   
  41.         }  catch  (NeedsRefreshException e) {   
  42.              this .cancelUpdate( this .keyPrefix+ "_" +key);   
  43.              throw  e;   
  44.         }   
  45.   
  46.     }   
  47.        
  48. }   
  49.   
  50.   
Java代码
  1. package  com.klstudio.cache;  
  2.   
  3. import  java.util.Date;  
  4.   
  5. import  com.opensymphony.oscache.base.NeedsRefreshException;  
  6. import  com.opensymphony.oscache.general.GeneralCacheAdministrator;  
  7.   
  8. public   class  BaseCache  extends  GeneralCacheAdministrator {  
  9.     //q期旉(单位为秒);  
  10.     private int refreshPeriod;  
  11.     //关键字前~字符;  
  12.     private String keyPrefix;  
  13.       
  14.     private static final long serialVersionUID = -4397192926052141162L;  
  15.       
  16.     public BaseCache(String keyPrefix,int refreshPeriod){  
  17.         super();  
  18.         this.keyPrefix = keyPrefix;  
  19.         this.refreshPeriod = refreshPeriod;  
  20.     }  
  21.     //d被缓存的对象;  
  22.     public void put(String key,Object value){  
  23.         this.putInCache(this.keyPrefix+"_"+key,value);  
  24.     }  
  25.     //删除被缓存的对象;  
  26.     public void remove(String key){  
  27.         this.flushEntry(this.keyPrefix+"_"+key);  
  28.     }  
  29.     //删除所有被~存的对?  
  30.     public void removeAll(Date date){  
  31.         this.flushAll(date);  
  32.     }  
  33.       
  34.     public void removeAll(){  
  35.         this.flushAll();  
  36.     }  
  37.     //获取被缓存的对象;  
  38.     public Object get(String key) throws Exception{  
  39.         try{  
  40.             return this.getFromCache(this.keyPrefix+"_"+key,this.refreshPeriod);  
  41.         } catch (NeedsRefreshException e) {  
  42.             this.cancelUpdate(this.keyPrefix+"_"+key);  
  43.             throw e;  
  44.         }  
  45.   
  46.     }  
  47.       
  48. }  

   通过CacheManagercL看怎样~存对象?q个cM所用的News只是具体功能的类Q我׃贴出来了Q你可以自己写一?
   
  1. package com.klstudio;   
  2.   
  3. import com.klstudio.News;   
  4. import com.klstudio.cache.BaseCache;   
  5.   
  6. public class CacheManager {   
  7.        
  8.     private BaseCache newsCache;   
  9.   
  10.        
  11.     private static CacheManager instance;   
  12.     private static Object lock = new Object();   
  13.        
  14.     public CacheManager() {   
  15.         //q个Ҏ配置文g来,初始BaseCache而已;   
  16.         newsCache = new BaseCache("news",1800);        
  17.     }   
  18.        
  19.     public static CacheManager getInstance(){   
  20.         if (instance == null){   
  21.             synchronized( lock ){   
  22.                 if (instance == null){   
  23.                     instance = new CacheManager();   
  24.                 }   
  25.             }   
  26.         }   
  27.         return instance;   
  28.     }   
  29.   
  30.     public void putNews(News news) {   
  31.         // TODO 自动生成Ҏ存根   
  32.         newsCache.put(news.getID(),news);   
  33.     }   
  34.   
  35.     public void removeNews(String newsID) {   
  36.         // TODO 自动生成Ҏ存根   
  37.         newsCache.remove(newsID);   
  38.     }   
  39.   
  40.     public News getNews(String newsID) {   
  41.         // TODO 自动生成Ҏ存根   
  42.         try {   
  43.             return (News) newsCache.get(newsID);   
  44.         } catch (Exception e) {   
  45.             // TODO 自动生成 catch ?  
  46.             System.out.println("getNews>>newsID["+newsID+"]>>"+e.getMessage());   
  47.             News news = new News(newsID);   
  48.             this.putNews(news);   
  49.             return news;   
  50.         }   
  51.     }   
  52.   
  53.     public void removeAllNews() {   
  54.         // TODO 自动生成Ҏ存根   
  55.         newsCache.removeAll();   
  56.     }   
  57.   
  58. }   
  59.   
Java代码
  1. package com.klstudio;  
  2.   
  3. import com.klstudio.News;  
  4. import com.klstudio.cache.BaseCache;  
  5.   
  6. public class CacheManager {  
  7.       
  8.     private BaseCache newsCache;  
  9.   
  10.       
  11.     private static CacheManager instance;  
  12.     private static Object lock = new Object();  
  13.       
  14.     public CacheManager() {  
  15.         //q个Ҏ配置文g来,初始BaseCache而已;  
  16.         newsCache = new BaseCache("news",1800);       
  17.     }  
  18.       
  19.     public static CacheManager getInstance(){  
  20.         if (instance == null){  
  21.             synchronized( lock ){  
  22.                 if (instance == null){  
  23.                     instance = new CacheManager();  
  24.                 }  
  25.             }  
  26.         }  
  27.         return instance;  
  28.     }  
  29.   
  30.     public void putNews(News news) {  
  31.         // TODO 自动生成Ҏ存根  
  32.         newsCache.put(news.getID(),news);  
  33.     }  
  34.   
  35.     public void removeNews(String newsID) {  
  36.         // TODO 自动生成Ҏ存根  
  37.         newsCache.remove(newsID);  
  38.     }  
  39.   
  40.     public News getNews(String newsID) {  
  41.         // TODO 自动生成Ҏ存根  
  42.         try {  
  43.             return (News) newsCache.get(newsID);  
  44.         } catch (Exception e) {  
  45.             // TODO 自动生成 catch ?/span>  
  46.             System.out.println("getNews>>newsID["+newsID+"]>>"+e.getMessage());  
  47.             News news = new News(newsID);  
  48.             this.putNews(news);  
  49.             return news;  
  50.         }  
  51.     }  
  52.   
  53.     public void removeAllNews() {  
  54.         // TODO 自动生成Ҏ存根  
  55.         newsCache.removeAll();  
  56.     }  
  57.   



C物 2010-08-09 15:57 发表评论
]]>
Hibernate ehcache配置二~存http://m.tkk7.com/libin2722/articles/328244.htmlC物C物Sun, 08 Aug 2010 08:40:00 GMThttp://m.tkk7.com/libin2722/articles/328244.htmlhttp://m.tkk7.com/libin2722/comments/328244.htmlhttp://m.tkk7.com/libin2722/articles/328244.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/328244.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/328244.html阅读全文

C物 2010-08-08 16:40 发表评论
]]>
Freemarker中用OSCachehttp://m.tkk7.com/libin2722/articles/328205.htmlC物C物Sat, 07 Aug 2010 07:53:00 GMThttp://m.tkk7.com/libin2722/articles/328205.htmlhttp://m.tkk7.com/libin2722/comments/328205.htmlhttp://m.tkk7.com/libin2722/articles/328205.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/328205.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/328205.html
例如Q?br /><#assign oscache=JspTaglibs['http://www.opensymphony.com/oscache']/>

<#assign fowUrlaa="">
<#if RequestParameters.fowUrl?exists>
<#assign fowUrlaa="${RequestParameters.fowUrl}">
</#if>
<@oscache.cache key="__oscache_categories" time=300>
    ${fowUrlaa}
</@oscache.cache>

然后再URL上添加参数测试:?fowUrl=12fas11

C物 2010-08-07 15:53 发表评论
]]>
(转蝲)在J2EEpȝ中应用OSCache http://m.tkk7.com/libin2722/articles/256728.htmlC物C物Thu, 26 Feb 2009 01:09:00 GMThttp://m.tkk7.com/libin2722/articles/256728.htmlhttp://m.tkk7.com/libin2722/comments/256728.htmlhttp://m.tkk7.com/libin2722/articles/256728.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/256728.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/256728.html本文来自Qhttp://m.tkk7.com/zhongli/archive/2009/02/22/256033.html

文章摘要

Cache是一U用于提高系l响应速度、改善系l运行性能的技术。尤其是在Web应用中,通过~存面的输出结果,可以很显著的改善pȝq行性能? 本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码目----OSCache。通过应用OSCacheQ我们不但可以实现? 常的Cache功能Q还能够改善pȝ的稳定性?/p>

1 面的问?/h4>

1.1 需要处理的Ҏ动态内?/h4>

在信息系l徏设过E中我们通常会遇到这L问题Q?/p>

1. 基础数据的变更问?/strong>

信息pȝ中需要处理的基础数据的内容短旉内是不会发生变化的,但是在一个相寚w一些的旉里,它却可能是动态增加或者减的?/p>

举个例子Q电子商务中关于送货区域的定义,可能短时间内不会发生变化Q但是随着电子商务企业业务的扩大,pȝ中需要处理的送货区域可能增加。所? 我们的系l中不得不在每次向客户展C送货区域信息的时候都和数据库Q假N货区域信息保存在数据库中,q也是通常采用的处理方法)q行交互?/p>

2. l计报表Q不仅限于统计报表)的问?/strong>

一般来_l计报表是一个周期性的工作Q可能是半个月、一个月或者更长的旉才会需要更Cơ,然而统计报表通常是图形显C或者是生成pdf、word、excel{格式的文gQ这些图形内宏V文件的生成通常需要消耗很多的pȝ资源Q给pȝq行造成很大的负担?/p>

1.2 问题的共同点


通过比较分析Q不隑֏现这两类问题有一些共同点Q?/p>

1、被处理的内容短旉不变Q所以短旉内可以作为静态内容进行处?/p>

2、在一个不太长的时间内Q被处理的内容可能或者必定生变化,所以必d他们作ؓ动态内容进行处?/p>

3、在合理的时间区D内可以忽略被处理内容变化后带来的媄?/p>

4、对q些内容的处理动作比较消耗系l性能Q媄响系l响应时?/p>

1.3 解决Ҏ


~存技术可以帮助我们很好的解决q个问题Q?/p>

1、缓存信?/p>

当上q的基础数据或者统计报表第一ơ被讉KӞ被处理的内容被当作动态信息,基础数库从数据库中获得,l计报表也会被生成符合要求的囑Ş、文Ӟ然后q些信息都会被放入缓存信息中?/p>

2、响应信息由~存提供

当上q的基础数据或者统计报表l被讉KӞpȝ会首先查缓存信息中是否有对应的内容和我们设定的~存规则Q如果符合缓存信息存在而且W合~存规则Q给出的响应来自于~存信息Q如果没有或者缓存信息已l不W合讑֮的要求,pȝ重复上一步的动作?/p>

很显Ӟ上面的步?中,多数情况下,当用戯求到达时Q被处理的内容将来自于缓存,所以大大的减少了与数据库的交互Q或者不再需要ؓ每个h都生成一ơ报表图形或者文Ӟq部分工作的减少对于降低pȝ性能消耗、提高系l稳定性和q发处理能力是非常有益的?/p>

2 OSCache?/h4>

OSCache是OpenSymphonyl织提供的一个J2EE架构中Web应用层的~存技术实现组Ӟ它的出现解决了我们面临的问题? OSCache目前最新的E_版本?.0Q本文中的例子都是基于这个版本的Q如果大家运行例子的q程中发生问题,请首先确认是否采用了正确的Y件版本?/p>

2.1 主要特征


1. 兼容多种支持JSP的web服务?/p>

已经通过兼容试的web服务器包括OrionServer (1.4.0或者以上版? 、Macromedia JRun (3.0或者以上版? 、BEA Weblogic (7.x或者以上版? 、IBM Websphere (5.0版本)、Silverstream (3.7.4版本)、Caucho Resin (1.2.3或者以上版?、Tomcat (4.0或者以上版? Q其他支持servlet2.3、jsp1.2的web服务器应该都是完全兼容OSCache的?/p>

2. 可选的~存?/p>

你可以用内存、硬盘空间、同时用内存和盘或者提供自q其他资源Q需要自己提供适配器)作ؓ~存区?/p>

  • 使用内存作ؓ~存区将可以提供更好的性能
  • 使用盘作ؓ~存区可以在服务器重起后q速恢复缓存内?
  • 同时使用内存和硬盘作为缓存区则可以减对内存的占?

3. 灉|的缓存系l?/p>

OSCache支持寚w分页面内Ҏ者对面U的响应内容q行~存Q编E者可以根据不同的需求、不同的环境选择不同的缓存别?/p>

4. 定w

在一般的web应用中,如果某个面需要和数据库打交道Q而当客户h到达Ӟweb应用和数据库之间无法q行交互Q那么将q回l用?pȝ出错"或者类似的提示信息Q如果用了OSCache的话Q你可以使用~存提供l用Pl自p得维护系l或者采取其他补救的旉?/p>

其它Ҏ还包括寚w的支持、缓存主动刷新等Ҏ,大家可以参考OpenSymphony|站上的其他资源获取更多的信息?/p>

3 OSCachelg的安?/h4>

OSCache是一个基于web应用的组Ӟ他的安装工作主要是对web应用q行配置Q大概的步骤如下Q?/p>

1. 下蝲、解压羃OSCache

请到OSCache的主?a >http://www.opensymphony.com/oscache/download.html http://www.bt285.cn/content.php?id=1196863  http://www.5a520.cn

下蝲Oscache的最新版本,作者下载的是OSCache的最新稳定版?.0?/p>

下载后的。Zip文g解压~到c:oscacheQ后面的章节中将使用%OSCache_Home%来表C个目录)目录?/p>

2. 新徏立一个web应用

3. 主要组?OSCache_Home%oscache.jar攑օWEB-INFlib目录

4. commons-logging.jar、commons-collections.jar的处?/p>

  • OSCachelg用Jakarta Commons Logging来处理日志信息,所以需要commons-logging.jar的支持,? ?OSCache_Home%libcorecommons-logging.jar攑օclasspathQ通常意味着这个文件放入WEB- INFlib目录Q?
  • 如果使用JDK1.3,请将%OSCache_Home%libcorecommons-collections.jar攑օclasspathQ如果用JDK1.4或者以上版本,则不需要了

5. oscache.properties、oscache.tld攑օWEB-INFclass目录

  • %OSCache_Home%oscache.properties包含了对OSCacheq行特征值的讄信息
  • %OSCache_Home%oscache.tld包含了OSCache提供的标{ֺ的定义内?

6. 修改web.xml文g

在web.xml文g中增加下面的内容Q增加对OSCache提供的taglib的支持:

<taglib>

<taglib-uri>oscache</taglib-uri>

<taglib-location>/WEB-INF/classes/ oscache.tld</taglib-location>

</taglib>

4 开始用OSCache中的~存lg


OSCache中按照缓存范围的不同分ؓ两种不同的方式:一U是~存JSP面中部分或者全部内容,一U是Z整个面文g的缓存?/p>

4.1 JSP部分内容~存


4.1.1 Cache-OSCache提供的缓存标{?/h4>

q是OSCache提供的标{ֺ中最重要的一个标{,包括在标{中的内容将应用~存机制q行处理Q处理的方式取决于~程者对cache标签属性的讄?/p>

W一ơ请求到达时Q标{中的内容被处理q且~存hQ当下一个请求到达时Q缓存系l会查这部分内容的缓存是否已l失效,主要是以下几:

  • 1. ~存旉过了cache标签讄的time或者duration属性规定的时旉
  • 2. cron属性规定的旉比缓存信息的开始时间更?
  • 3. 标签中缓存的内容在缓存后又被重新hq?
  • 4. 其他~存期讑֮

如果W合上面四项中的M一,被缓存的内容视ؓ已经失效Q这时被~存的内容将被重新处理ƈ且返回处理过后的信息Q如果被~存的内Ҏ有失效,那么q回l用L是~存中的信息?/p>

cache标签的属性说?

key - 标识~存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被讉K面的URI和后面的h字符丌Ӏ?/p>

你可以在同一个页面中使用很多cache标签而不指定他的key属性,q种情况下系l用该面的URI和后面的h字符Ԍ另外再自动给q些key增加一个烦引值来区分q些~存内容。但是不推荐采用q样的方式?/p>

scope - ~存发生作用的范_可以是application或者session

time - ~存内容的时间段Q单位是U,默认?600U,也就是一个小Ӟ如果讑֮一个负|那么q部分被~存的内容将永远不过期?/p>

duration - 指定~存内容失效的时_是相对time的另一个选择Q可以用简单日期格式或者符合USO-8601的日期格式。如Qduration='PT5M' duration='5s'{?/p>

refresh - false 或者true?/p>

如果refresh属性设|ؓtrueQ不其他的属性是否符合条Ӟq部分被~存的内定w被更新Q这l编E者一U选择Q决定什么时候必d新?/p>

mode - 如果~程者不希望被缓存的内容增加到给用户的响应中Q可以设|mode属性ؓ"silent"

其它可用的属性还包括Qcron 、groups、language、refreshpolicyclass、refreshpolicyparam?/p>

上面的这些属性可以单独用,也可以根据需要组合用,下面的例子将讲解q些常用属性的使用方式?/p>

4.1.2 Cache标签实例分析:


1. 最单的cache标签用法

使用默认的关键字来标识cache内容Q超时时间是默认?600U?/p>
<cache:cache>

<%

//自己的JSP代码内容

%>

</cache:cache>

2. 用自己指定的字符串标识缓存内容,q且讑֮作用范围为session?/p>
<cache:cache key="foobar" scope="session">

<%

//自己的JSP代码内容

%>

</cache:cache>

3.动态设定key|使用自己指定的time属性设定缓存内容的时旉Q用动态refresh值决定是否强制内容刷新?/p>

因ؓOSCache使用key值来标识~存内容Q用相同的key值将会被认ؓ使用相同的的~存内容Q所以用动态的key值可以自qҎ不同的角艌Ӏ不同的要求军_使用不同的缓存内宏V?/p>
<cache:cache key="<%= product.getId() %>" time="1800" refresh="<%= needRefresh %>">

<%

//自己的JSP代码内容

%>

</cache:cache>

4. 讄time属性ؓ负数使缓存内Ҏ不过?/p>
<cache:cache time="-1">

<%

//自己的JSP代码内容

%>

5. 使用duration属性设|超期时?/p>
<cache:cache  duration='PT5M'>

<%

//自己的JSP代码内容

%>

6. 使用mode属性被缓存的内容不加入给客户的响应中

<cache:cache  mode='silent'>

<%

//自己的JSP代码内容

%>

4.2 用CashFilter实现面U缓?/h4>

在OSCachelg中提供了一个CacheFilter用于实现面U的~存Q主要用于对web应用中的某些动态页面进行缓存,其是那些需要生 成pdf格式文g/报表、图片文件等的页面,不仅减少了数据库的交互、减数据库服务器的压力Q而且对于减少web服务器的性能消耗有很显著的效果?/p>

q种功能的实现是通过在web.xml中进行配|来军_~存哪一个或者一l页面,而且q可以设|缓存的相关属性,q种Z配置文g的实现方式对于J2EE来说应该是一U标准的实现方式了?/p>

[注] 只有客户讉K时返回http头信息中代码?00Q也是讉K已经成功Q的面信息才能够被~存

1. ~存单个文g

修改web.xmlQ增加如下内容,定?testContent.jsp面q行~存?/p>
<filter>

<filter-name>CacheFilter</filter-name>

<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>CacheFilter</filter-name>

<!-?testContent.jsp面内容q行~存-->

<url-pattern>/testContent.jsp</url-pattern>

</filter-mapping>

2. ~存URL pattern

修改web.xmlQ增加如下内容,定?.jsp面q行~存?/p>
<filter>

<filter-name>CacheFilter</filter-name>

<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>CacheFilter</filter-name>

<!-Ҏ有jsp面内容q行~存-->

<url-pattern>*.jsp</url-pattern>

</filter-mapping>

3. 自己讑֮~存属?/p>

在页面~存的情况下Q可以通过讄CacheFilter的初始属性来军_~存的一些特性:time属性设|缓存的旉D,默认?600U,? 以根据自q需要只有的讄Q而scope属性设|,默认为applicationQ可选项包括application、session

<filter>

<filter-name>CacheFilter</filter-name>

<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>

<init-param>

<param-name>time</param-name>

<param-value>600</param-value>

</init-param>

<init-param>

<param-name>scope</param-name>

<param-value>session</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>CacheFilter</filter-name>

<!-Ҏ有jsp面内容q行~存-->

<url-pattern>*.jsp</url-pattern>

</filter-mapping>

5 性能试l果


5.1 试环境


pȝq_Qwindows 2000 高服务? P3 800 /512M内存

web服务器:websphere 5.0

数据库服务器Qmysql 4.0.18-nt

性能试用工Papache Jmeter

5.2 试计划


q次性能试Ҏ方ؓ使用~存和不使用~存两种Q他们的讉K代码都是一LQ通过数据源从本地mysql数据库中获取person表的所有记录,然后昄在页面上?/p>

试中将模仿10个用P每个用户发v5ơ请求,然后l计所有访问花费的旉?/p>

5.3 试l果


使用~存后的试l果 不用缓存时的测试结?/p>

所有请求花费的L?毫秒) 20569 22870

性能试的详l结果请大家查看下蝲内容中的《不使用cache时的pȝ性能试l果.txt》和《用cache后系l性能试l果.txt?/p>

6 ȝ


在J2EEpȝ中,我们l常需要处理一些特D的动态内容,q些内容在一个时间段内的变更非常有限Q但是又不得不将他们定为动态内容进行输出,而且 非常消耗数据库pȝ资源或者web服务器的资源Q这时我们就可以采用Cache----一U用于提高系l响应速度、改善系l运行性能的技?---来优? 我们的系l。尤其是在Web应用中,q种处理可以很显著的改善pȝq行性能?/p>

本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码目----OSCache。它提供了在J2EEpȝ中实现缓存需? 的丰富的功能。通过应用OSCacheQ我们不但可以实现通常的Cache功能、自q讑֮cache的相关特性比如缓存时间段/~存内容{,提升pȝ? 能,而且q能有效的改善系l的E_性。除此之外,OSCachelgq提供了更多的特性比如集、容错、灵zȝ~存区选择{?/p>

作者根据自q使用l验l大家提供了一些简单的例子Q他们部分演CZ如何使用OSCachelg提供的丰富特性,OSCache提供的特性远不止q些Q需要大家在今后的时间里深入的研I?/p>

C物 2009-02-26 09:09 发表评论
]]> վ֩ģ壺 ޳avƬ| Ƶ˳߲| ۺϾþ123| պþ| վɫƬѸ| þþþþþþþùƷ | ĻѲ| þԭav| jizz߹ۿ| 츾avһ| 99ƵƷר| ˾þô߽槼| 2019Ļ| ɫͼУ԰ɫ| þþƷվѹۿ| Ʒ޹av| ۺϼר| þҹҹ³³Ƭ| վѹۿ| 18վڵ| Ʒ޵һ| ޳˰aa߹ۿ| ߾Ʒۿѹۿ| ձþþþĻ| ԭƵ99| AV˾Ʒպ | aëƬȫƵ| Ůʮ·Ůbbw| AV֮պƷ| ůůձĻ| պ޹Ƶ| aëƬ18ϹۿƷ| ߹ۿƬ˳Ƶ| Ƶ߹ۿ| mm1313޾Ʒ| þ99Ʒѹۿ| ַ߹ۿ| ˾þô߽ۺͼƬ| 99reƵ| ɫƷƵ| ɫͼƷ|