天天看点

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

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

最近在开发一个比较大型的项目,主要采用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访问数据库的快,实际上,这两种方式的效率应该是差不多的。但它有一个好处,就是减少了很多查询方法的使用,对数据集的访问都采用了一致的方法来实现。另外,将服务端数据集和客户端数据集封装在一起之后,这两种方式对开发人员来说,几乎是透明的,都采用了一致的方法方式,随时可以进行方法方式的互换,这个将在后面进行说明。

客户端数据集和服务端数据集进行封装

由于客户端数据集和服务端数据集的方法一模一样,只不过数据访问方式不同而已。那么,我们可以将它们封装成一个统一的类,只是在初始化的时候,指明的数据的访问方式,在调用方法的时候,则可以根据指明的访问方式,分别调用不同的实现。

这样做的好处就是,这两种方式对开发人员来说是透明的,开发人员之一的初始化的时候,更换的访问方式,那么整个数据集的访问方式都会改变,而代码则不需进行改变。