作者:徐建祥(netpirate@gmail.com)
时间:2007-07-18
来自:http://www.anymobile.org
经常使用的数据一般都会缓存起来,提高效率。对于数据量比较大的,如图片、资讯类,可以采用缓存Cache+索引的机制处理;而对于比较简单的数据,可以通过简单的数据容器进行缓存。当然,它们最终一般都存放在Hashtable 或 HashMap等容器中。
Cache 应用的原理大致是:初始化时将原数据导入Cache中或惰性加载;经常被查询(点击率高)的置前;当数据总大小超过Cache容量后,调整容量大小或清理不经常使用(点击率低)的数据;数据超过有效期,及时清理;对于查询失败的数据,需CHECK一下。
简单的数据容器,将需要缓存的数据保存至单独的容器,并在一定的条件下进行数据同步。同步的方法大致有2种:启用一个时间线程,定期集中检查、处理各个容器的周期同步操作;或者由各个容器单独维护自身的周期和同步操作。
前者统一处理,不会有额外的开销,缺点是添加一个新的容器,都需要添加到同步线程中;后者单独处理,实现起来比较快捷、没有任何约束,而且互不影响,但使用的时候有额外的处理和对象开销。
当然,单独处理并不代表就是所有的业务逻辑都在各容器中控制执行,可以使用代理机制来解决这个问题。
静态代理:代理对象与被代理的对象都必须实现同一个接口,在代理对象中可以实现CHECK等服务,并在需要的时候再调用被代理的对象,这样代理对象就只保留业务相关职责。
动态代理:JDK1.3以后开始支持动态代理,处理者的类实现java.lang.ref.InvocationHandler类,可以使用一个处理者(Handler)服务于各个对象。
动态代理相对效率低些,集合静态代理机制,数据容器大致流程如下:
所有的数据容器都实现Container接口,定义生命周期、同步数据时的时间戳,同步方法和读取数据的方法;定义一个静态代理类,在查询数据的时候,检查数据容器是否过期,过期则调用容器的同步方法。
类图如下:
序列图如下:
样例代码如下:
Container container = new StaticProxy( EntityContainer.getInstance() );
int[] arr = (int[]) container.getOne("025");
了解AOP的,很容易就会想到pointcut,advisor,MethodBeforeAdviced等等,原理类似,略。
(全文完)
posted on 2007-07-18 10:07
Xu Jianxiang 阅读(518)
评论(0) 编辑 收藏 所属分类:
Design Research 、
Java Tech