客户端数据集/服务端数据集的原理和设计

来源:互联网 发布:淘宝新店每天刷多少单 编辑:程序博客网 时间:2024/06/07 15:48
  
客户端数据集/服务端数据集的原理和设计
 
最近在开发一个比较大型的项目,主要采用Activex控件做底层操作,采用Javascript做逻辑控制和处理,采用Ajax实现服务端与客户端之间的交互,而在实际应用中发现,采用Ajax方式,对数据库的访问效率远远无法满足系统的需求,所以就设计开发出了客户端数据集/服务端数据集。
 
Ajax的实现原理
在介绍我的设计之前,先简单介绍Ajax的原理,以及其效率低的原因。从根本上来说,Ajax是采用微软的一种叫XMLHttp的技术,异步访问一个远端路径,返回页面结果。从这一点可以看出来,对一个数据库访问操作来说,采用Ajax方式至少会有以下两种性能消耗,一是访问远端路径是,传到远端路径的数据,需要消耗一定的时间;二是返回页面结果,数据从远端返回到客户端,需要一定的时间,而且对页面的解析也需要消耗性能。
 
DWR的实现原理
DWR是Ajax的一个框架,这里将DWR的原因是,我的系统开发是选择了DWR来实现Ajax功能。DWR的好处是,可以将一些Java类映射成一个Javascript的对象,从而可以在javascript中非常方便的使用Java类。
DWR是Ajax的框架,那么其实现原理应该是跟Ajax一样的,但是它将远端访问和页面结果解析部分封装一起了。大概原理是这样的,写一个java类,在DWR的配置文件配置了该Java类映射到DWR的相关数据后,DWR就会自动生成想要的javascript代码,访问对于Javascript函数,系统就会调用DWR的对于远端路径,而远端路径经过一番处理后,就会调用对应的Java类的方法,然后将调用该方法的结果返回客户端,客户端再对数据进行处理封装,将结果返回成跟Java类类似结果的Javascript数据。
 
Dojo简介
dojo是一个js的工具集,一个面向对象的js框架(在widget中更能体现这点),根据功能分成多个module,每个module又分为多个package,可以根据程式的需要导入不同的package,类似于JAVA。
说白了,dojo使得Javascript就好像面向对象语言一样,有类,有方法,开发其大型项目更加容易。
客户端数据集/服务端数据集采用了dojo框架,使其实现起来有类,有方法,更加容易使用。
 
客户端数据集介绍
 
一、传统Ajax访问方式效率低的原因
传统访问方式效率低,是因为从服务端下载数据到客户端比较慢,特别是对数据库的访问,如果返回的数据有几百条甚至几千条数据,那么采用DWR方式,从服务端下载到客户端,这需要等待较长时间。
从传统采用Submit方式跳转到一个Servlet,然后在返回页面数据的方式(如查询功能),由于查询都在服务端实现,客户端一般只返回单页数据,所以对比较快。
 
二、需要客户端数据集的原因
为什么不采用服务端的方式,把大部分查询都在服务端执行,然后只返回最终的很少的数据呢?
这个需要具体情况具体分析,一般简单的系统,采用上面所说的方式,应该足够,也不需要很费力气的开发出一个客户端数据集来。而对于我上面所说的系统来说,由于主要采用Javascript进行开发(而不是Java),数据库访问有比较频繁,如果频繁的采用Ajax来访问服务端,性能必然受到影响。而采用DWR方式,由于直接调用Java类,有些方法本来就是返回比较多的数据,如果硬着进行改造,开发出特定需要,只返回很少数据量的方法,那么,方法的可复用性和可维护性将大打折扣,只会造成,每次数据库方法都再写特定需要方法,而且,有些情况很难做到这返回需要的几条数据。
 
三、客户端数据集的原理
在这种情况下,我们想到了Dephi语言中的客户端数据集。它是实现方式很好的满足了对频繁数据访问的需要,而且,采用了统一的查询访问方式,大量的减少了查询方法的数量,使得对数据的查询几乎跟具体的Java类没有关系了。
现在讲讲实现原理,它的实现原理就是在系统登录的时候,将需要比较大量访问的表全部下载到客户端保存起来(这边采用保存在Array数据的方式,跟DWR一致),而当需要访问数据库数据的时候,就直接在客户端访问,从而较少了客户端与服务端的交互。
 
四、客户端数据集的方法
客户端数据集采用跟具体表无关的设计方式,开发一个叫ClientDataSet的Javascript类,它的主要方法如下:
setData:这个方法用来设置数据,默认new一个ClientDataSet,产生了一个空的数据集,只有调用了这个方法之后,才会根据数据里面的信息,设置字段信息,和数据。
Locate:这个用来定位第一条满足条件的数据,传入字段名、字段值(可多个),系统就会查询数据集,找出第一条满足传入条件的数据
fieldByName:一般调用locate方法定位到一个数据后,可以调用这个方法,传入字段名,就可以返回这个字段的值了。
setFilter:设置过滤条件,调用该方法,传入过滤字段和字段值,那么数据集就会根据数据条件进行过滤,返回过滤后的数据集。
SetIsfiltered:调用该方法,传入true,则进行过滤;传入false,则取消过滤。
First:走到数据集的第一条数据
Prior:走到当前定位数据的前一条数据
Next:在当前数据集的位置上,走到下一条数据
Last:走到数据集的最后一条数据
Eof:判断当前位置是否为数据集的结束位置(即Last的下一条数据)
 
服务端数据集
 
一、需要服务端数据集的原因
采用客户端数据集,需要在系统登录的时候,将所有数据集下载到客户端,如果数据集的数据量比较大,那么,登录的时候,所需要消耗的时候就比较大。从这一个出发,所以设计了服务端数据集。
 
二、服务端数据集的原理
服务端数据集是在服务器启动的时候,将所需要的数据集下载到服务端,目前采用ArrayList来保存一个数据集,用Map来对数据集进行管理;实现一个ServiceDataSet类(Java类)来实现对实现对数据集的各种管理(不存储数据)。在一个用户登录系统的时候,在缓存中保存该用户所需要的ServiceDataSet,由于ServiceDataSet只存储了用户使用数据集的定位等信息,而不真实保存数据。所以,服务端数据集就做到了所有用户共用一份数据集,而每个用户登录后,保持了自己私有的ServiceDataSet。
在访问数据集中,系统先通过DWR访问Java类,从Java类访问数据后,返回给Javascript。
 
三、服务端数据集的方法
服务端数据集拥有跟客户端数据集一模一样的方法。
 
四、服务端数据集的好处
从上面的实现方式,你可能感觉到该方法,效率好像不比直接采用DWR访问数据库的快,实际上,这两种方式的效率应该是差不多的。但它有一个好处,就是减少了很多查询方法的使用,对数据集的访问都采用了一致的方法来实现。另外,将服务端数据集和客户端数据集封装在一起之后,这两种方式对开发人员来说,几乎是透明的,都采用了一致的方法方式,随时可以进行方法方式的互换,这个将在后面进行说明。
 
客户端数据集和服务端数据集进行封装
由于客户端数据集和服务端数据集的方法一模一样,只不过数据访问方式不同而已。那么,我们可以将它们封装成一个统一的类,只是在初始化的时候,指明的数据的访问方式,在调用方法的时候,则可以根据指明的访问方式,分别调用不同的实现。
这样做的好处就是,这两种方式对开发人员来说是透明的,开发人员之一的初始化的时候,更换的访问方式,那么整个数据集的访问方式都会改变,而代码则不需进行改变。
原创粉丝点击