用Datasnap 构建多层数据应用


 一、Datasnap与多层数据应用 Datasnap是集成在delphi7中的一项数据访问技术,在Delphi5以前它被称为MIDAS(Multi -tier Distributed Application Services Suite),即多层分布式应用服务套件。 Datasnap是用来开发多层应用系统的透明中介引擎。通过Datasnap可以使用相同的组件存 取不同的后端应用程序服务器,而且它是跨平台的,无论在Windows还是其他操作系统上都 可以使用。 1. 分布式应用系统结构 在传统的两层C/S模式应用系统中,客户端应用程序直接访问后端数据库服务器,这存在很 大的弊端: 一是当连接到数据库服务器的客户应用程序过多时,数据库服务器的执行效率会降低; 二是由于数据库服务器的限制,整个系统的应用被限制在某一个固定的区域中工作,例如 一个局域网。 三是企业逻辑和商业规则往往被写死在客户端应用程序中,或者通过存储过程等手段写在 数据库当中,而这两种方法都有各自的缺点。 如果所有的逻辑和规则都写在客户端应用程序中,一旦这些逻辑发生变化,就要修改所有 的客户端应用,这个弊端在我们先前的应用中已经有所表现。 如果逻辑和规则写死在服务器端的数据库中,则由于要执行大量的企业逻辑,这会大幅降 低数据库服务器的工作效率,而且会影响系统的通用性和移植性。 如果考虑Web应用,现在的数据库都支持Web应用的访问,但都不直接提供Web服务,而是需 要编写Web服务代码通过Web服务器如IIS间接的访问数据库,企业逻辑和规则被写入到这些 代码中,如ASP代码。一旦企业逻辑和规则变更,则需要同时修改Web服务代码。 通常的C/S结构,在这种结构中,对远程用户而言,Web服务器是server端,而在局域网内部,它和其他普通 局域网用户一样的访问数据库服务器,所以它们除了权限之外大部分的逻辑应用是非常相 似的,而他们采用的语言和代码却是完全不一样的。 如果把这些相同的逻辑提取出来,加上权限等控制信息,就成为了简单的多层应用系统。

在这种情况下,大部分的控制和应用逻辑都集中到中间应用层,普通客户端和Web服务 器只需要负责与用户的界面交互,并将交互反应给应用服务器即可。因为传统的技术和We b应用均可以直接访问应用服务器,所以可以避免大量的重复性开发和维护工作。 在加入了中间应用服务器之后的结构中,数据服务器的性能依然可以得到很好的利用 ,例如集中式的数据存储,主从结构的多表修改等都可以通过数据服务器的存储过程来实 现。但这并不表示所有的企业逻辑和商业规则都可以通过存储过程实现,如复杂的多表计 算、非精确数据表示等。 2. 分布式多级体系的优势 多级系统和普通C/S系统相比存在以下主要优势: (1)在多级系统结构中,由于应用服务器集中实现了企业逻辑和商业规则,客户程序只需 要将重点放在数据显示和与用户交互上,数据库的存储和内部结构对客户端而言已经无关 紧要。对数据库修改更新的代价大大减少。 (2)由于普通技术和Web技术均可以访问应用服务器,所以不需要维护两套几乎完全重复 但语言不同的代码,避免重复开发和维护的麻烦。另外由于Datasnap直接支持Socket和TC P/IP连接,所以甚至可以将客户端直接用于远程连接,而避免不同的Web浏览器带来的显示 和使用麻烦。 (3)大量的企业逻辑和商业规则封装在中间应用服务器之后,客户端就可以做的很瘦,客 户端程序的发布、安装、配置和维护将更加简单。从这个角度讲,多层体系同时具备 了B /S和C/S的优点,因为中间应用服务器充当了双重的角色。 (4)极大的可扩充性。由于Datasnap实现了分布式处理和负载平衡功能,不同的应用功能 可以做成不同的中间服务器,而多个应用服务器既可以访问同一个数据库又可以访问不同 数据库甚至不同机器上的数据库,因为不管是中间服务器还是数据库服务器在哪对客户端 而言并不重要。由于负载平衡和分布式结构,一台服务器的停止不会使所有应用停止。 (5)增强了安全性。可以把敏感功能封装在中间件中并提供不同的权限,同时又不至于使 用户界面变得复杂。另外利用Server和client端的事件可以加入各种控制信息,如加密、 解密、压缩、解压等。 (6)Datasnap支持多种连接方式、支持多种分布式系统(DCOM、CORBA等),这些都封装 了事务和安全服务,所以使用Datasnap技术构建多层分布式应用可以免去大量复杂和低级 代码的编写,诸如网络访问、事务管理等等。 二、使用Datasnap进行数据访问 使用Datasnap不仅可以像普通数据库应用程序一样的访问数据,而且可以保存数据为文件 、从其他数据集中获取数据等。 1. 普通数据访问 Datasnap的客户端通过中间层服务器的DataSetProvider间接的访问数据库,DataSetProv ider可以通过任何可用的连接方式(包括ADO)从不同的数据库服务器(包括Access)获取 数据,而客户端则不需要知道数据库具体在哪,是什么格式,用什么连接,只需要将Remo teSever或ConnectionBroker设置为一个指向某一个可用服务器的连接,然后就可以从服务 器的IAppServer接口获得可用的数据。如果服务器端不允许进行某些数据的访问就可以直 接屏蔽,这些数据在客户端将不可见。 客户端与服务器端的数据是通过类型为Variant的Data数据包进行的,这种数据包已经经过 了压缩,并加入了附加信息,任何类型的数据元素都可以通过Data传送。 客户端可以一次性获取满足要求的所有数据记录,也可以分段式的获取记录,对于如图片 等大型数据可以特别处理。 通过服务器端的接口,客户端可以动态更改所需要的数据集,甚至更改数据库的连接。对 数据的查询和过滤 既可以在服务器端进行也可以在客户端进行,但在服务器端被过滤掉的 数据将不会再传送到客户端。 已经传送到客户端的数据在下次读取时不会再次创送,而是放在客户端的缓存中。从服务 器的数据读取是以Delta的形式进行的,当然,可以用函数刷新全部的记录。无论是已经存 储在客户端的记录还是未被应用到实际数据库的改动都可以单独呈现,并可以文件的方式 存储在客户端。(注意:慎用ClientDataSet的filename,如果存在,客户端将会将此文件 作为缓存,下次启动客户端时将自动从此缓存读取数据而不是从服务器读取数据。) 使用ClientDataSet的CommandText可以执行类似于ADOCommand的数据库更新操作,这种操 作可以返回数据集也可以不返回数据集。CommandText可以存放普通的SQL语句。这里 的S QL语句将会通过服务器端的对应数据集来执行,该数据集原有的SQL语句将被替换,所以应 当使用单独的Query来执行这种任务。 因为服务器端的数据模块是以线程的方式存在的,任何两个客户端的操作不会冲突。使用 pooling技术可以让多个线程为多个客户端所共享,并可以减少关闭和打开数据库的次数。 在客户端对数据的更新必须调用ApplyChanges才能将改动写入到服务器中,写入之后并不 重新读取数据库,而是采用将改动同时合并到客户端原有数据的方法。 2. 多用户事务处理 当多用户同时连接到一个应用服务器对数据库进行操作时,发生冲突是常见的。 注意:下面的情况不会发生冲突: 用户A修改了记录1,用户B修改了记录2,当它们应用修改时不会发生冲突,因为修改是以 Delta方式应用在服务器上的,而应用修改之后并不会重新读取数据,所以此时A和B客户端 的记录1和记录2显示结果是不一样的,分别是它们修改之后的记录,此时如果A修改记录2 就会发生错误。 当发生冲突时可能的解决方式如下: Skip,跳过,这将跳过发生冲突的记录,而将没有发生冲突的记录应用到服务器上。被跳 过的记录在该客户端依然处于未被应用的状态,除非成功应用该更新或撤销更新(即置Ch anged Count为0),否则将无法从服务器刷新数据。 Cancel,取消,这将中止整个应用修改的过程,已经更改的记录已经写入到数据库,未更 改的数据在客户端维持原状,但Changed Count变为0,可以进行刷新。 Merge,合并,这种方法将服务器端的数据看作好像没有被修改过一样,强行将修改加入到 数据库中。但是当其他用户删除了某一条记录之后,对这条记录的修改只能作废。 Refresh,刷新,这将丢弃发生冲突的修改操作,而读取服务器端的这条记录来替换它。其 他没有发生冲突的所有修改仍将执行。该操作执行完毕后可以马上刷新。 Abort,中止整个应用修改的过程,不管是有冲突的还是没有冲突的,都不会被应用到服务 器,客户端维持原状,Change Count不为0,必须正确应用修改或撤销之后才能更新数据。 Correct,修正。这个类型比较特别。它允许对发生冲突的记录在处理冲突的过程中进行修 改,冲突处理完成之后,客户端的相应记录被替换为设置的值。其他没有冲突的记录正常 修改到服务器。 当处理不同的冲突情形时应当采用不同的处理方式,当无法决定采用哪一种方法时应当让 用户来决定。 3. 主从数据库访问 Datasnap可以将服务器端的Master / Detail 数据结构完整的映射到客户端,从数据表在 客户端呈现为主数据表的一个特殊字段,利用这种主从映射可以保证数据库的完整性,而 对数据库的修改也只需要执行对主数据表的应用修改方法。 主从数据结构的映射可以使用分级获取的方法,如果采用分级读取数据,主数据表读取的 同时并不会马上读取从数据表,只有调用相关的方法才会从服务器端读取数据。 主从结构映射对层次没有限制,即可以构造多层的 Master / Detail数据结构。当主表的 游标移动时,从表将同时移动游标,而不需要手动的数据操作。但是多层的Master / Det ail结构会使主表的数据包过于庞大,会加大网络负荷,而采用分级获取数据的方法可以减 小数据包,同时,应尽量不要在客户端和服务器之间传送过多的“select * ……”类型的 数据集。 4. 本地数据访问 利用ClientDataSet可以完成多种本地数据存储和访问方式。 第一种是使用ClientDataSet的Save to File 和Load from File方法,这种方法可以将客 户端的数据保存为XML格式或CDS(Client Data Set)格式。如果设置了ClientDataSet的 File Name属性,这两个方法将会自动调用,同时所指定的文件将会成为本地缓存,因为文 件在客户端程序退出后依然存在,所以这种方法可以用于脱机浏览。但是不利的是,上一 次没有更新到服务器上的修改将依然存在,除非这些修改正确更新或者被取消,否则不能 从服务器刷新数据。 第二种方法是单向的,为了和其他传统的连接方式相适应,可以把其他类型的数据集,如 BDE,ADO等,传递给ClientDataSet,这样,ClientDataSet不仅可以访问远程服务器,而 且可以访问本地数据库。但是在同一个ClientDataSet中这两种方式不能并存,即同一时间 ClientDataSet中的数据要么是本地的,要么是远程的。 利用ClientDataSet的Data方法可以方便的与其他方式的连接保持兼容,甚至共存。 三、容错、安全和负载平衡 容错、安全和负载平衡是Datasnap封装的技术,利用这些技术可以使多层分布式系统更加 稳健的运行。 1. 容错和负载平衡 容错能力,就是当一台应用服务器发生故障时,Datasnap技术可以找到另外一台功能相同 的应用服务器继续为客户端应用提供服务,也就是说,容错技术使通过冗余来实现的。 实现容错技术,需要有多台运行中间服务器的机器,这些机器上都运行着已经注册过的应 用服务器。客户端通过Object Broker来连接服务器,而不是直接通过Remote Server,通 过这种方式,Object Broker将根据网络的实际情况选择连接到哪一台服务器,如果客户机 运行过程中原服务器出错,Object Broker将会找到另一台服务器继续服务。 但是这里有一个问题还没有得到考证:多台服务器上的数据如何保持一致,是否是自动的 。 负载平衡技术实际上也是通过冗余来实现的,当有多个客户端需要服务时,负载平衡就是 让这些客户端连接到不同的服务器上,以使各个服务器承受合适的负荷。 2. 安全性 Datasnap技术本身具有一定的安全性,如果需要对在网络中传输的数据包进行额外加密、 解密,数据拦截技术可以为此提供帮助。 另外因为服务器端的连接仍然采用传统连接方式,所有传统连接支持的功能在多层数据系 统中仍然能够得到很好的支持。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM