缓存(Cache)()
以上代码将载入EHCache的配置文件并生成CacheManager的实例之后就可以通过CacheManager对Cache进行管理
将数据存入Cache的实现如下
public static void put(String cachenameSerializable keySerializable value){
managergetCache(cachename)put(new Element(key value))
}
在put()操作中首先指定要使用的Cache名称接着就是类似于HashMap的名值对get()操作也是类似
public static Serializable get(String cachenameSerializable key){
try {
Element e=managergetCache(cachename)get(key)
if(e==null)return null;
return egetValue() //取得缓存中的数据
} catch (IllegalStateException e) {
eprintStackTrace()
} catch (CacheException e) {
eprintStackTrace()
}
return null;
}
有了以上的工具类便可以更方便地在实际工作中使用EHCache从软件设计的角度来说笔者建议在频繁使用且重负载的函数实现中加入缓存以提高它在频繁调用时的性能
在为方法加入缓存时可以使用最原始的硬编码方式根据传入的参数构造key然后去缓存中查找结果如果找到则立即返回如果找不到则再进行相关的业务逻辑处理得到最终结果并将结果保存到缓存中并返回这个结果这种方式的实现好处是代码比较直白缺点是缓存组件和业务层代码紧密耦合依赖性强
本小节介绍基于动态代理的缓存解决方案对动态代理尚不了解的读者可以回顾前文中代理模式一节基于动态代理的缓存方案的最大好处是在业务层无需关注对缓存的操作缓存操作代码被完全独立并隔离并且对一个新的函数方法加入缓存不会影响原有的方法实现是一种非常灵活的软件结构
注意使用动态代理无需修改一个逻辑方法的代码便可以为它加上缓存功能提高其性能
现在假设有一个可能被频繁调用的方法它用于对一个整数做因式分解实现如下(由于本文不关注因式分解算法故只列出该类的结构)
public class HeavyMethodDemo {
public String heavyMethod(int num) {
StringBuffer sb = new StringBuffer()
//对 num 进行因式分解将结果保存在sb中
return sbtoString()
}
}
使用CGLIB生成动态代理类的方法拦截器的逻辑如下
public class CglibHeavyMethodInterceptor implements MethodInterceptor {
HeavyMethodDemo real=new HeavyMethodDemo()
@Override
public Object intercept(Object arg Method arg Object[] arg
MethodProxy arg) throws Throwable {
String v=(String)EHCacheUtilget(cache (Serializable)arg[]) //查询缓存
if(v==null){
v=realheavyMethod((Integer)arg[]) //缓存中未找到结果
EHCacheUtilput(cache (Integer)arg[] v) //保存计算结果
}
return v;
}
//省略其他代码
返回目录Java程序性能优化让你的Java程序更快更稳定
编辑推荐
Java程序设计培训视频教程
JEE高级框架实战培训视频教程
JME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLEG数据库开发优化指南