现在的位置: 首页 > 综合 > 正文

数据容器与静态代理

2013年04月16日 ⁄ 综合 ⁄ 共 1104字 ⁄ 字号 评论关闭

作者:徐建祥(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的,很容易就会想到pointcutadvisorMethodBeforeAdviced等等,原理类似,略。

 (全文完)

抱歉!评论已关闭.