• 对Smart Client中客户端数据缓存的思考


     

    Smart Client中客户端数据缓存的思考

     

    问题的背景:

    最近在写一个基于Smart ClientBug跟踪软件(BugTiger),在整个系统中有一张核心的表(Bug),表中大部分列都是外键.因此每次读Bug表的时候需要和其他表进行联接操作,客户端需要的是联接后的Bug(为方便以下简称BugDetails).客户端如何取得BugDetails表并进行缓存就是一个很关键的问题.

     

    为什么要进行数据缓存:

    1.         为了允许用户进行离线工作.

    为了能让客户端在脱机或无法连接到服务器时依旧能够工作,需要对数据进行缓存.这时客户端是对缓存的数据进行操作,网络重新连接时再进行数据同步.

    2.         提高应用程序的响应速度.

    当用户在客户端进行操作时,不用每次从服务器上读取数据,而是读取本地的数据缓存,这样将有效提高应用程序的响应速度.

    3.         减轻服务器负担.

    客户端定时从服务器上读取的数据,然后与本地数据进行合并,而不是每次读取全部数据,从而减轻网络和服务器的负担.

     

    如何进行数据缓存:

    为便于对问题的讨论,把数据库中的表结构简化如下:

    方案一:

    在服务器上进行数据表的联结(为方便讨论以下把联结后的表称BugDetails),客户端下载BugDetails保存在DataSet. BugDetails中既有SeverityID,又有SeverityName.为什么要这么设计?SeverityNameBug列表时需要使用,显示给用户时当然要使用SeverityName,而不是SeverityID; SeverityID在用户编辑Bug时需要用到,因为不能保证Severity表中的SeverityName是唯一的.多个表的联接使得BugDetails字段非常多.

     

    缺点:

    1.         数据下载的冗余非常巨大.如每条记录都有SeverityName,但此属性已经包含在Severity表中.实际BugTigerBug表的关系远比示例复杂,数据的冗余是非常的大的,冗余数据超过了1/2.

    2.         当父表更改时, BugDetails表中大量数据将成为新的数据,客户端需要重新下载.Severity表中某条记录更改了SeverityName,与此记录相关的Bug记录将和Severity表重新联接,生成新的BugDetails记录,客户端需要重新下载这些记录.

    3.         客户端增加Bug记录时是先添加到数据缓存中的,当与服务器进行数据同步时再上传数据,而不是直接向服务器上传数据.这样做主要是为了在离线时也能增加Bug.对客户端的BugDetails表进行增加记录时,由于BugDetails表字段非常多,增加操作时需要填写的字段很多,

     

    方案二:

    在服务器上不进行联接操作,客户端下载各个Table的数据到DataSet(把数据库中的Table映射成DataSet中的DataTable),再对DataSet中的DataTable进行联接从而产生新的BugDetails.

    :多个表的合并可以参见《如何把一个DataTable中的某列通过表关系加到另外一个DataTablehttp://www.cnblogs.com/pcbhyy/archive/2005/09/13/235655.html

    缺点:

    1.         需要从多个DataTable生成BugDetails,这个过程涉及的DataTable如果较多时,十分复杂.

    2.         任意一张表的数据变化都将导致BugDetails表的重新构建.

          

    方案三:

           在客户端增加一个小型的数据库,把服务器上的数据存储到客户端的数据库上.

    缺点:

           需要维护和操作两个数据库.

            目前在BugTiger中使用了第一种方案,想听听大家对这三种方案的看法 .

  • 相关阅读:
    JAVA获取随机数
    web路径问题
    java.lang.IllegalStateException: Failed to load ApplicationContext,这个异常的解决方案
    使用表达式配置切入点
    Spring的aop操作
    AOP操作术语
    AOP原理
    AOP概念
    spring知识点
    Spring的ioc操作 与 IOC底层原理
  • 原文地址:https://www.cnblogs.com/zitiger/p/243638.html
Copyright © 2020-2023  润新知