`
coolerbaosi
  • 浏览: 727275 次
文章分类
社区版块
存档分类
最新评论

数据容器与静态代理

 
阅读更多

作者:徐建祥(netpirate@gmail.com

时间:2007-07-18
来自:http://www.anymobile.org

经常使用的数据一般都会缓存起来,提高效率。对于数据量比较大的,如图片、资讯类,可以采用缓存Cache+索引的机制处理;而对于比较简单的数据,可以通过简单的数据容器进行缓存。当然,它们最终一般都存放在HashtableHashMap等容器中。

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的,很容易就会想到pointcutadvisorMethodBeforeAdviced等等,原理类似,略。

(全文完)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics