JAVAWEB缓存技术.doc_第1页
JAVAWEB缓存技术.doc_第2页
JAVAWEB缓存技术.doc_第3页
JAVAWEB缓存技术.doc_第4页
JAVAWEB缓存技术.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

可以实现不等待,线程自动更新缓存。CacheData.java 存放缓存数据的Bean01.packagecom.cari.web.cache;02./*03.* author zsy04.*05.*/06.publicclassCacheData 07.privateObject data;08.privatelongtime;09.privateintcount;10.11.publicCacheData() 5.publicCacheData(Object data,longtime,intcount) 16.this.data = data;17.this.time = time;18.this.count = count;19.20.21.publicCacheData(Object data) 22.this.data = data;23.this.time = System.currentTimeMillis();24.this.count =1;25.26.27.publicvoidaddCount() 28.count+;29.30.31.publicintgetCount() 32.returncount;33.34.publicvoidsetCount(intcount) 35.this.count = count;36.37.publicObject getData() 38.returndata;39.40.publicvoidsetData(Object data) 41.this.data = data;42.43.publiclonggetTime() 44.returntime;45.46.publicvoidsetTime(longtime) 47.this.time = time;48.49.CacheOperation.java 缓存处理类001.packagecom.cari.web.cache;002.importjava.lang.reflect.Method;003.importjava.util.ArrayList;004.importjava.util.Arrays;005.importjava.util.Hashtable;006.mons.logging.Log;007.mons.logging.LogFactory;008./*009.* author zsy010.*/011.publicclassCacheOperation 012.privatestaticfinalLog log = LogFactory.getLog(CacheOperation.class);013.privatestaticCacheOperation singleton =null;014.015.privateHashtable cacheMap;/存放缓存数据016.017.privateArrayList threadKeys;/处于线程更新中的key值列表018.019.publicstaticCacheOperation getInstance() 020.if(singleton =null) 021.singleton =newCacheOperation();022.023.returnsingleton;024.025.026.privateCacheOperation() 027.cacheMap =newHashtable();028.threadKeys =newArrayList();029.030.031./*032.* 添加数据缓存033.* 与方法getCacheData(String key, long intervalTime, int maxVisitCount)配合使用034.* param key035.* param data036.*/037.publicvoidaddCacheData(String key, Object data) 038.addCacheData(key, data,true);039.040.041.privatevoidaddCacheData(String key, Object data,booleancheck) 042.if(Runtime.getRuntime().freeMemory() 0& (System.currentTimeMillis() - cacheData.getTime() intervalTime) 067.removeCacheData(key);068.returnnull;069.070.if(maxVisitCount 0& (maxVisitCount - cacheData.getCount() =0) 071.removeCacheData(key);072.returnnull;073.else074.cacheData.addCount();075.076.returncacheData.getData();077.078.079./*080.* 当缓存中数据失效时,用不给定的方法线程更新数据081.* param o 取得数据的对像(该方法是静态方法是不用实例,则传Class实列)082.* param methodName 该对像中的方法083.* param parameters 该方法的参数列表(参数列表中对像都要实现toString方法,若列表中某一参数为空则传它所属类的Class)084.* param intervalTime 缓存的时间周期,小于等于0时不限制085.* param maxVisitCount 访问累积次数,小于等于0时不限制086.* return087.*/088.publicObject getCacheData(Object o, String methodName,Object parameters,089.longintervalTime,intmaxVisitCount) 090.Class oc = oinstanceofClass ? (Class)o : o.getClass();091.StringBuffer key =newStringBuffer(oc.getName();/生成缓存key值092.key.append(-).append(methodName);093.if(parameters !=null) 094.for(inti =0; i 0& (System.currentTimeMillis() - cacheData.getTime() intervalTime) 109.daemonInvoke(o, methodName, parameters, key.toString();/缓存时间超时,启动线程更新数据110.elseif(maxVisitCount 0& (maxVisitCount - cacheData.getCount() =0) /访问次数超出,启动线程更新数据111.daemonInvoke(o, methodName, parameters, key.toString();112.else113.cacheData.addCount();114.115.returncacheData.getData();116.117.118./*119.* 递归调用给定方法更新缓存中数据据120.* param o121.* param methodName122.* param parameters123.* param key124.* return 若反射调用方法返回值为空则返回该值的类型125.*/126.privateObject invoke(Object o, String methodName,Object parameters, String key) 127.Object returnValue =null;128.try129.Class pcs =null;130.if(parameters !=null) 131.pcs =newClassparameters.length;132.for(inti =0; i parameters.length; i+) 133.if(parametersiinstanceofMethodInfo) /参数类型是MethodInfo则调用该方法的返回值做这参数134.MethodInfo pmi = (MethodInfo)parametersi;135.Object pre = invoke(pmi.getO(), pmi.getMethodName(), pmi.getParameters(),null);136.parametersi = pre;137.138.if(parametersiinstanceofClass) 139.pcsi = (Class)parametersi;140.parametersi =null;141.else142.pcsi = parametersi.getClass();46.Class oc = oinstanceofClass ? (Class)o : o.getClass();147./ Method m = oc.getDeclaredMethod(methodName, pcs);148.Method m = matchMethod(oc, methodName, pcs);149.returnValue = m.invoke(o, parameters);150.if(key !=null& returnValue !=null) 151.addCacheData(key, returnValue,false);152.153.if(returnValue =null) 154.returnValue = m.getReturnType();155.156.catch(Exception e) 157.log.error(调用方法失败,methodName=+ methodName);158.if(key !=null) 159.removeCacheData(key);160.log.error(更新缓存失败,缓存key=+ key);161.162.e.printStackTrace();163.164.returnreturnValue;165.166.167./*168.* 找不到完全匹配的方法时,对参数进行向父类匹配169.* 因为方法aa(java.util.List) 与 aa(java.util.ArrayList)不能自动匹配到170.*171.* param oc172.* param methodName173.* param pcs174.* return175.* throws NoSuchMethodException176.* throws NoSuchMethodException177.*/178.privateMethod matchMethod(Class oc, String methodName, Class pcs179.)throwsNoSuchMethodException, SecurityException 180.try181.Method method = oc.getDeclaredMethod(methodName, pcs);182.returnmethod;183.catch(NoSuchMethodException e) 184.Method ms = oc.getDeclaredMethods();185.aa:for(inti =0; i ms.length; i+) 186.if(msi.getName().equals(methodName) 187.Class pts = msi.getParameterTypes();188.if(pts.length = pcs.length) 189.for(intj =0; j pts.length; j+) 190.if(!ptsj.isAssignableFrom(pcsj) 191.breakaa;192.193.194.returnmsi;98.thrownewNoSuchMethodException();02./*203.* 新启线程后台调用给定方法更新缓存中数据据204.* param o205.* param methodName206.* param parameters207.* param key208.*/209.privatevoiddaemonInvoke(Object o, String methodName,Object parameters, String key) 210.if(!threadKeys.contains(key) 211.InvokeThread t =newInvokeThread(o, methodName, parameters, key);212.t.start();16./*217.* 些类存放方法的主调对像,名称及参数数组218.* author zsy219.*220.*/221.publicclassMethodInfo 222.privateObject o;223.privateString methodName;224.privateObject parameters;225.publicMethodInfo(Object o, String methodName,Object parameters) 226.this.o = o;227.this.methodName = methodName;228.this.parameters = parameters;229.230.publicString getMethodName() 231.returnmethodName;232.233.publicvoidsetMethodName(String methodName) 234.this.methodName = methodName;235.236.publicObject getO() 237.returno;238.239.publicvoidsetO(Object o) 240.this.o = o;241.242.publicObject getParameters() 243.returnparameters;244.245.publicvoidsetParameters(Object parameters) 246.this.parameters = parameters;247.248.249.publicString toString() 250.StringBuffer str =newStringBuffer(methodName);251.if(parameters !=null) 252.str.append();253.for(inti =0; i parameters.length; i+) 254.if(parametersiinstanceofObject) 255.str.append(Arrays.toString(Object)parametersi).append(,);256.else257.str.append(parametersi).append(,);258.259.260.str.append();261.262.returnstr.toString();263.264.265.266./*267.* 线程调用方法268.* author zsy269.*270.*/271.privateclassInvokeThreadextendsThread 272.privateObject o;273.privateString methodName;274.privateObject parameters;275.privateString key;276.publicInvokeThread(Object o, String methodName,Object parameters, String key) 277.this.o = o;278.this.methodName = methodName;279.this.parameters = parameters;280.this.key = key;281.282.283.publicvoidrun() 284.threadKeys.add(key);285.invoke(o, methodName, parameters, key);286.threadKeys.remove(key);287.288.289.290./*291.* 移除缓存中的数据292.* param key293.*/294.publicvoidremoveCacheData(String key) 295.cacheMap.remove(key);296.297.298./*299.* 移除所有缓存中的数据300.*301.*/302.publicvoidremoveAllCacheData() 303.cacheMap.clear();304.305.306.publicString toString() 307.StringBuffer sb =newStringBuffer(* );308.sb.append(正在更新的缓存数据: );309.for(inti =0; i threadKeys.size(); i+) 310.sb.append(threadKeys.get(i).append( );311.312.sb.append(当前缓存大小:).append(cacheMap.size().append( );313.sb.append(*);314.returnsb.toString();315.316.用法:例1:代码片段如下:public class Test String rulStr=.;String encoding=.;public void getData() DataCreator c = new DataCreator(); String result = c.initUrlData(urlStr,encoding); System.out.println(result);每次执行上面代码时都要通过调用 initUrlData方法取得数据,假设此方法很耗资源而耗时间,但对数据时实性要求不高,就是可以用以下方式进行缓存处理,保证很快地取得数据,并根据设置的参数自动更新缓存中数据注意:initUrlData方法参数值一样时才属于同一个缓存,否则会生成一个新的缓存,也就是说从缓存中取数据与initUrlData方法参数值有关.public void getData() DataCreator data = new DataCreator(); CacheOperation co = CacheOperation.getInstance(); String str = (String)co.getCacheData(data, initUrlData,new ObjecturlStr, encoding,120000, 100); System.out.println(result);.getCacheData方法返回值与initUrlData方法返回类型一样,参数说明:data:调用initUrlData方法的实列,如果该方法是静态的,则传类的类型,如(DataCreator .class);initUrlData:方法名称;new Objecturl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论