Multi-Tier结构程序 |
|
z33 时间:2001-11-01 10:40 责编:My FAQ |
|
摘要:Multi-Tier结构程序开发基础教程(一) |
|
Multi-Tier结构程序开发基础教程 (一.1)
作者:z33
鉴于同学们刚接解Delphi,并对老师上课所讲的Multi-Tier结构编程不是十分理解,所以我写了下 面一个教程,给我最好的同学们,希望这篇教程能帮助同学们更好的学习Delphi,不要掉队,也希望我通过写一写学习的经验,总结一下,对Delphi有 更深的了解。 |
多层开发的基本概念我不想多说了,我只把写一下它的这实现过程。 一、首先编写应用程序服务器,这个服务器的作用是连接数据库和客户端,起到承接客户端和数据库服务器之前的桥(暂且叫它桥吧)。 1、新建一个工程, File - New - Application 。 2、再往新建的工程上放一个实现多层的“远程数据模板”(中文我觉得应该叫这个), File - New - Other -Multitier - Remote Data Module - 单击OK。 3、接上一步,会出现一个对话框, 名字起好了填上去点OK就可以了。 上图中,CoClass Name就是此程序的名称,叫COM的名称,这个名称最好起一个有意义名字,因为在你做客户端的时间需要依据这个名字连接到这个服务器。比如是:multi_test (意思是多层测试)或者 X_test ,好记~而且酷!。 {下面灰色字这一段不需要看懂 下面的Instancing选择服务器的处理线程方式,现在选的是Multiple Instance是指多前客户端可共享一个线程应用程序服务器。还有Single Instance是多对多的处理方式,就是一个客户端对应一个线程应用程序,当多客户端时,服务端也会开和客户端一样多的线程运行,好处是各线程相对独立,不会相互影响,但相对比较占资源。而Internal是创建一个In-Process的COM程序(DLL文件格式),这项用得比较少,据我理解是需要和其它对象兼容而设的,这是我的理解,有不同看法欢迎讨论。 最后一个Threading Model是用它设置In-Process COM程序的多任务模式的,太多了,懒得讲了,大家自己看书吧。} 4、 继续干!拖一个Table1组件到Form1上去,设置Table1的DatabaseName为DBDEMOS,Table Name为Customer.db。(这部分是基础,我不多讲了,不懂去学学前面的知识。)再拖一个DataSetProvider1组件(不要问我ClinentDataSet组件在哪个栏里,自已找!),并设置它的DataSet属性为Table1。这里DataSetProvider组是向客户端提供数据集的接口。DataSetProvider(数据集提供者),DataSet属性是设置它的数据集是什么,这里指向Table1这个数据集。弄好了这些,我们的服务器就完成了,接下来运行即可,运行的目的是让服务器在系统中注册。 (另外你也可以在Form1上添一个Label标签,标识一下,如下图: 5、保存工程。 二、 编写客户端应用程序 1、新建一个工程。 File - New - Application 2、拖一个TDCOMConnection控件到Form1上(还是那句话,不要问我它在哪儿)。 把它的ComputerName属性设成127.0.0.1,这里要说明一下: ComputerName这个属性是设置你要连接的服务器,填上127.0.0.1就是自己的机器,因为要在自己的机器上调试嘛。当然如果希望连到别的机器上也可以,当然前提是别的机器有已经做好并注册运行的Application Server ,简单说就是上面咱们做的应用程序服务器。 举个例子,如果你要在我的机器上有已经做好并运行的Application Server,那么我的机器名是c2109,你就可以在ComputerName里填上我的c2109这个计算机名就可以连到我的机器操作了。当然也可以 填IP地址,因为有些计算机名可能会引起错误,比如“可乐猫”的计算机名,好像就是“可乐猫”,中文名呀,你敢用吗?我不敢,还是用IP连接吧,是不是? 然后,再去设置ServerName的属性,这个属性里面你会找到你刚才建立的服务器名称,忘了?回去看看。 3、再拖一个TClientDataSet控件,把RemoteServer属性设置为DCOMConnection1,再把Provider属行选为DataSetProvider1。注意,当你点上Provider属性时,应用程序服务器将会被启动。(这时不要把那个服务器的窗口关掉,留着它,不然会出错!) 如下图: 4、接着拖一个TDataSource和TDBGrid,TDBNavigator到Form1上,设置DataSource1的DataSet属性为:ClientDataSet1,并把DBGrid1和DBNavigator1的DataSource属性设置为:DataSource1,最后把ClientDataSet1的Active属性设置为:True,激活。 5、保存工程,并运行,至此这个简单的Mulit-Tier已经好了,你学会了吗? 最终效果如图: |
这一节里,其实我应该讲一下ActionList的Standard action来实现DBNavigator的工能,因为本节所讲的并没能真正的实现它的ClientDataSet的ApplyUpdates的功能,也 就是说不能提交数据,但现在我该睡觉了,所以剩下的留到下一节去讲吧。如果你觉得我讲的有问题,哪个地方讲错了,欢迎来找我讨论,大家一起学习,最 后。。。。希望大家都能看明白。呵呵~ 对了,还有就是多层的数据库异常处理,虽然老师演示了一下,但我仍然有些地方不明白,想老师新建的那一个Reconcile Error Dialog来做异常处理我觉处理没什么价值,而且不合理,等我再研究研究。:) |
本节源程序下载 | 真正实现ApplyUpdates源程序下载
Multi-Tier结构程序开发基础教程 (一.2)
作者:z33
上一节只讲了Multi-Tier的连接,其实上一节就应该把这个一起都讲了,但因为时间有限,所以分成两部分讲了,呵呵~。 因为Multi-Tier结构和普通单机对数据库操作是不一样的,我们也就无法用单机的方法往数据库里写数据,这一节就讲一下在多层结构下对数据操作。 |
我们要再利用上第一节的程序,这次要往上放一些对数据操作的功能。 一、首先现在我们不用DBNavigator1,而用ActionList控件来实现数据的操作,,我们还需要自己建5个铵钮,并通过ActionList的Standard Action来实现这些功能。 1、往Form1上放5个铵钮,再拖一个Standard控件栏的最后一个控件:ActionList控件,这个控件是帮助我们快速完成铵钮功能的控件,如图: 下面我们来实现它: a.双击ActionList控件,出现Editing Form1.ActionList1窗口,在窗口左半部空白处点鼠标右键,再选“New Standard Action...”项,如图: b. 出现了Stand Action列表,我们在里面找到DataSet项,把这项里的所有子项都选上,再点OK,如图: c.再设置每个按钮的Action属性为对应的Action预置功能。如下表: d. 把每个铵钮的Caption 相对应功能的名称即可。如图: e. 双击“写入”按钮,在里面写入如下加粗的语句就可以实现向数据库提交修改: procedure TForm1.Button5Click(Sender: TObject); begin clientdataset1.ApplyUpdates(0); end; 其中ApplyUpdates是ClientDataSet的方法(method),功能是提交客户端数据到服务器端,括号里的0表示发生错误的最大值为0,即不允许有错误。 |
铵钮 | Action属性 | 实现功能 |
Button1 | DataSetInsert1 | 插入一条数据 |
Button2 | DataSetEdit1 | 编辑当前记录 |
Button3 | DataSetDelete1 | 删除当前记录 |
Button4 | DataSetCancel1 | 取消当前操作 |
Button5 | 不设置 | 把修改写入数据库(Caption:=写入) |
到这里咱们的第一节就完了, 我该去洗洗睡了~~,这次没讲多少东西,最主要的就是那个写入铵钮的
clientdataset1.ApplyUpdates(0);这个语句才能实现向
数据库提交数据。
下一节讲一下Multi-Tier的Transaction(事务处理),
服务器响应机制和错误处理机制。
Multi-Tier结构程序开发基础教程(二) |
|
z33 时间:2001-11-01 10:40 出处:互联网 责编:My FAQ |
|
摘要:Multi-Tier结构程序开发基础教程(二) |
|
<script charset="utf-8" src="http://www.myfaq.com.cn/images/ad.js" language="javascript" type="text/javascript"></script> <script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> |
Multi-Tier结构程序开发基础教程 (二.1)
作者:z33
这一节讲一下多层的事务处理,有些地方可能比较难理解,甚至根本就不明白,这没关系,只要多做几次,做的多些就会明白了,学Delphi的这些东西不可能做一遍就会的,越是麻烦的东西越要多做几次才能记住。 |
一、什么是事务处理
据我理解(通过王晓敏同学的大力帮助,终于对事务处理有了一些理解,但不知道这个理解是否准确)
它就是在客户端上对服务器上的多个相互有关系的数据集同时发生多个相互有联系操作,当这些相关操作执行时,其中有一个操作失败,那么其它所有操作全部取消,数据集回滚到操作前的状态。所以这些操作就要做为一个事务来处理,去判断是否需要回滚。
比如主从表结构就是相关数据集,我们要删除主表数据必需要先删除从表的相关纪录,所以为它们的操作就需要用到事务处理。
二、
1.建一个新工程,并加入Remote Data Module,Remote Data Module的名字起一个有意义并且好记的。再放上DataSetProvider,Table,Database这三个控件。对其属性进行设置:
Database1.AliasName:=DBDEMOS ;
Database1.DatabaseName:=test ;
Database1.HandleShared:=true ; //可以让很多Client共享数据库连接
Database1.Translsolation:=tiDirtyRead ; //因为Paradox只支持DirtyRead
Database1.LoginPrompt:=False ; //不要Login
Database1.Connected:=true ;Table1.DatabaseName:=test ;
Table1.TableName:=Customer.DB ;
Table1.Active:=True ;
DataSetProvider1.DataSet:=Table1 ;
如图:
2.选View菜单中的Type Library项,打开Type Library编辑窗口。
点窗口的工具栏上面一个绿色箭头的铵钮,服务器对象栏上会多出一个结点,你可以输入一个名字,这里输入ApplyDates,为服务器添加了一个ApplyDates方法。
如图:
其中,Attributes栏里的ID设置为1,Parameters栏里的Name填CustVar,Type里选上VARIANT,然后点一下上面的刷新铵钮,就可以把这个窗口关掉了。
如图:
这里说明一下,在Parameters(参数)里设置的是服务器一个的接收变量的接口(Interface),用来接收以后客户端传过来的一个事务,其中CustVar是接收来的变量名,VARIANT是变量类型。第三个是那个in,它是表示服务器的动作,我们这里只是in(接收变量),不out(返回变量)。
3.现在来编写服务器端的代码:
在代码区里找到刚才定义的方法过程的实现部分,就是这部分:
procedure Tads.ApplyDates(CustVar: OleVariant);
begin
end;
实现代码如下:
--------------------------
procedure Tads.ApplyDates(CustVar: OleVariant);
var
Errcount:Integer; //定义一个出错次数的整型变量。
begin
Database1.StartTransaction; //数据库开始事务。
try //这是异常处理,对应下面的except,如果有异常就执行except下面的指令。
if not VarIsNull(CustVar) then //VarIsNull()是个函数,如果实参为空就返回True。
begin
//通过DataSetProvider的的ApplyUpadtes方法对其应用操作。
CustVar:=DataSetProvider1.ApplyUpdates(CustVar,0,ErrCount);
//如果出错次数大于0,就是有错误的话,中断事务。
if ErrCount > 0 then
SysUtils.Abort;
end;
Database1.Commit; //提交事务更新。
except
Database1.Rollback; //出错就会被回滚。
end;end;
这样服务器端的设置就完成了。
今天因为看了部电影,所以没太多时间整理客户端的教程了,下一次写吧。
|
下面我们做客户端
1.首先新建一个工程,并再填一个DataModule。在DataModule上放上DCOMConnection,ClientDataSet,和DataSource控件,各自属性设置如下:
控件名 | 属性 |
DCOMConnection1 | ServerName设为服务器名 Connected:=True; LoginPrompt:=False; |
ClientDataSet1 | RemoteServer:=DCOMConnect1 ProviderName:=DataSetProvider1 Active:=True; |
DataSource1 | DataSet:=ClientDataSet1 |
2.然后回到Form1上,到Form1的代码中的implementation下加入 uses unit2;,使之可以调用DataModule上的内容。再 拖一个DBGrid1上去。
如图:
3. 再编辑DataModule2的代码,如果没改名的话,就是Unit2的代码。找到Public,声明一个过程,在其下一行输入:procedure applydates;
再到implementation下一行,把这个过程写出来,代码如下:
procedure tdatamodule2.applydates;
var
CustVar:OleVariant;
begin
//这行是自动提交修改信息的语句。
ClientDataSet1.CheckBrowseMode;
//下面几句是把修改的数据存入CustVar变量。如果没修改CustVar的值设成空(NULL)。 if ClientDataSet1.ChangeCount >0 then
CustVar:=ClientDataSet1.Delta
else
CustVar:=NULL; //这句需要在上面的uses里加入Variants。
try
//通过DCOMConnection把CustVar传服务器端的ApplyUpdates去,是咱们自己写的。忘了?回去看看
DCOMConnection1.AppServer.Applydates(CustVar);
showmessage('已经成功的写入服务器数据库'); //这里如果出错,请在uses中填上Dialogs
except
showmessage('错误写操作'); //异常处理,如果出错就执行句。
上面这些代码比就是客户端上传数据的代码,CustVar变量对应服务器端咱们设的CustVar变量,两个变量名可以不一样,但一般设成一样的比较好。
4. 再拖5个铵钮上去,属性设置和事件代码如下:
双击铵钮就会进入OnClick的代码区,就填这儿。
控件 | 属性 | OnClick事件代码 |
Buttion1 | Caption:=插入 | Datamodule2.ClientDataSet1.Append; |
Buttion2 | Caption:=修改 | Datamodule2.ClientDataSet1.Edit; |
Buttion3 | Caption:=删除 | Datamodule2.ClientDataSet1.Delete; |
Buttion4 | Caption:=写入 | Datamodule2.Applydates; //这句是调用刚才在DataModule2里自己填上去的过程。 |
Buttion5 | Caption:=取消 | Datamodule2.ClientDataSet1.CancelUpdates; |
设置完成如图:
好了,这次客户端的所有设置也完成了,运行看看吧,运行通不过??呵呵,去查查是不是什么地方设置错了,或代码是不是写错了。
-------------------------------
累死我了,我要睡觉了。
http://www.myfaq.com.cn/A/2001-11-01/3466.html
一:优点:灵活性和可扩展性。
应用三层开发技术(分布式)的原因
(参考书目: Delphi 5.x分布式多层应用系统篇)
一:解决客户机/服务器结构的维护成本问题,改善客户机/服务器结构延展性问题。
客户机/服务器结构支持的用户人数有一定限度(200人以下)。则种结构限制了Internet/Intranet及电子商务的发展。三层开发应用Database Pooling, Object pooling,Resource Pooling,线程模式提供了高度延展性。
二:解决应用逻辑重复使用的问题。
例如:当企业要在原有的客户机/服务器结构上添加Web浏览服务时,就需要配置Web服务器,重新编写所有应用逻辑,并且更新MIS系统。在三层结构中,用COM/DCOM, CORBA(Common Object Request Broker Architecture)对象,或Enterprise Java Bean等,封装企业的逻辑程序代码(称之为企业对象),可以解决上述问题。大大降低开发和维护的成本。
三:整合不同系统结构的需要,及时应用新技术的需要。
二:Microsoft的三层服务模型
1:结构:是windows DNA(distributed internet applications,分布式内部网)COM(component object model ,构件对象模型)构件作为实现系统及应用程序服务的工具。
l 用户服务
l 业务服务
l 数据服务
(1)用户服务:windows DNA定义了四种可用于实现用户服务层的客户:
n 标准浏览客户:依赖于简单,基于页面的HTML来管理数据表示和与用户进行交互.其兼容性 很好,功能不丰富。
n 增强型浏览器客户:汲取某个特殊浏览器(ex: Dynamic HTML ,脚本及ActiveX控件)的优点来最大化用户接口的丰富性和功能 ,适用于公司intranet .
n 依赖型Internet客户:能在客户机器上将对Internet的访问和对操作系统的访问集成在一块。
n 增强型Internet客户:Microsoft Office 97和Microsoft Visual Studio.
(2)业务服务:通过将基于服务器的Microsoft产品与定制的COM构件运行环境集成在一块来实现。
n Web服务( Microfsoft Internet Information Server与Active Server Pages ).
n 事务和构件服务 (Microsoft Transaction server和 COM) .
n 消息服务(Microsoft消息队列服务器)。
n 通用数据访问(universal data access)(Microsoft数据访问过件)
l 大型机环境的互操作(Microsoft SNA服务器). 其详细信息在下面的专题中列出。
(3)数据服务:
n Microsoft SQL Server7数据库。
n Microsoft Exchange server 5.5版本的目录和信息库。
专题:
业务服务
一:Web服务( Microsoft Internet Information Server与Active Server Pages ).
Web服务对象模型:
1,server对象:提供对服务器上方法和属性的访问.例:问(universal data access)(Microsoft数据访问构件) setobjmyobject=server.createobject(“businessserver.myruleobject”)
2:Session对象: 用来存储一个特定用户会话所必须的信息。
3:Application对象:用来使某个应用程序的所有用户共享息。
4:Request对象:略。
5:Response对象:略.
二:事务和构件服务 (Microsoft Transaction server和 COM)
1:Microsoft事务服务器(MTS)是基于构件的事务处理系统,用来满足复杂事务处理。MTS支 持SQL Server和任
何基于X/open算法的XA协议的数据库(见注释)。
MTS提供的服务有:
n 对分布事务的支持。
n 用于控制实例化和使用对象安全的服务。
n 过程和线程的自动管理。
n 对象实例的管理。
n 数据库连接管理(连接池)。
在应用程序中可声明相应的构件完成以上服务。
2:MTS和SQL server事务一样,要求原子执行,或整个成功,整个失败。Transaction Server与Microsoft Distributed Transaction Coordinator(MSDTC)交互确认事务满足ACID(原子性Atomicity,一致性Consistency,分离性Isolatation和耐久性Durability)。
3:MTS和SQL server事务的区别.MTS可以用visual basic ,visual c++ 等封装的MTS构件实现 , Recordset对
象的addnew方法添加新行。SQL server事务只能由Transact-SQL代码编写,如 (ADO).
4:Windows DNA(windows distributed internet application architecture):将客户/服务模式开发与web和在一起的战略 .
使用HTML,DHTML,Active server pages向用户提供第一层(表达层), MTS和MTS的构件, 如IIS(internet information server),IIS/ASP构件及ASP脚本占据中间层(业务逻辑层),SQL server作为数据服务层。
5:MTS使用分布事务协调者(Distributed Transaction Coordinator , DTC)事务引擎.DTC使用两级段交付标准。
关于DTC的信息可通过一下方法得到:用MMC(Microsoft Management Console)打开c:/winnt/system32/services.msc,
在右边的列表中找到DTC服务,察看其属性。
6:使用MTS最大化系统性能。(注意事项)
n 避免传递或返回对象。
n 尽可能通过值(BY VAL)来传递参数。(By Val关键字使网络间的旅程最小)
n 避免创建数据库游标。少用RecordSet对象。
n 通过使对象包容器线程化(Apartment Threaded),MTS可以在多个对象中执行并发的客户请求。
7:
注释:XA是一种由X/Open组织定义的两相提交协议,允许多个数据库服务期间的事务协同,并将其看作一个事务。(Unix数据库,包括oracle ,informix,db2都支持)
三:消息服务(Microsoft消息队列服务器)。
1:Microsoft消息队列(Microsoft Message Queue ,MSMQ)为应用程序提供了异步通信功能.MSMQ被认为是连接分布式应用程序中业务与数据服务层的桥梁。
2:MSMQ自动与MTS集成。应用程序可以将MSMQ消息封装在MTS事务中。
3:MSMQ与Microsoft exchange服务器的不同.exchange提供用户到用户(person -to -person)的消息传送.而MSMQ提供应用程序到应用程序(application - to -application)的消息传送.
四:通用数据访问(universal data access)(Microsoft数据访问构件)
数据访问构件跨越了业务服务层和数据服务层之间的界限。ADO,OLE DB(嵌入式数据库)以及ODBC共同组成了Microsoft数据访问构件(MDAC).
五:大型机环境的互操作(Microsoft SNA服务器)
Microsoft的COM &DCOM(简介)
一:COM是一种定义对象服务器如何与对象客户进行交互的协议。对象服务器(object server)是实现COM类的模块。对象客户(object consumer)是使用COM对象的模块。
DCOM扩展了COM协议,使得对象服务器可以位于一台与客户不同的计算机。 通过RPC向对象服务器调用。(CORBA也是分布对象协议)
COM通过SSPI(Security Support Provider Interface,安全支持提供者接口)来管理对象的安全性。
二:应用服务器(中间层)应具备的特性:
n 远层启动,监视和中止的能力。
n 可扩展的能力。
n 易于配置的能力。
n 安全失效的能力。
远层启动功能:如果用户想在远程计算机上创建一个COM对象,远程机上的DCOM服务控制管理器(Service Control Manager ,SCM)会自动启动COM服务器并使COM对象可用。具体信息可在开始菜单中运行DCOMCNFG命令。
易于配置的能力:在Windows资源管理器中右击一个COM DLL或EXE就可激活注册或撤销注册。
可扩展的能力:可扩展的第一等级和第二等级。DCOM提供的两种负载均衡。1),静态负载均衡(指定应用服务器的运行机器),可在DCOMCNFG中的应用程序的属性中指定。2):动态负载均衡,由调度程序进行分配。
Delphi提供的相关技术:
u COM / DCOM / COM+企业对象。
u CORBA企业对象。
u XML / HTML
u CGI / SAPI/NSAPI
u ASP
u Active X (Active Form)
u ADO / OLE DB
u BDE / IDAPI SQL Links
u MTS对象
u MIDAS服务器
u CORBA服务器。
相关组件在1) File菜单/new/ Multitier和ActiveX页中。
2)在组件面板中的ADO, Midas, Internet Express, ActiveX等页中。
Corba简介
1:什么是corba(common object request broker architecture)?
Corba是由object manangement group(OMG)定义的分布式对象标准结构。语言中立,使用了面向对象的设计结构,允许软件对象在不同的操作系统平台和应用程序中重复使用。
如果想实现一下功能,corba是较好的解决方案:
l 应用系统必须执行关键性任务,具备安全强固的容错能力,必须稳定,有效率。
l 想开发使用Web对象的Internet/Intranet解决方案。
l 应用系统未来想和Java整合。
2:corba的结构
corba对象是一个提供特定服务的组件,它通过定义一组输出接口来声明可以提供的服务。在这个输出接口中,corba对象定义了客户端可以调用的方法和存取属性。客户端只要指明提供服务的corba对象的名称以及要调用的方法或是要
存取的属性就可以通过ORB得到corba对象提供服务。
术语介绍:
ORB: object request broker.联结客户端和中介的corb对象。
Stub对象: 运行在客户端的corba对象的复制品,在客户端调用的是Stub对象,然后Stub对象通过ORB远程调用
CORBA对象,Stub对象用Marshaling(对象指针转换,使对方程序能够识别)自动为你传递参数和数据。
Skeleton对象:运行在服务器端的对象,将传递到服务器的数据还原成服务器端使用格式。然后根据自动根据客户端要求调用CORBA对象。
调用方式:
u 静态调用:客户端程序通过Stub对象将数据传递到corba对象,corba对象执行完毕后,通过Skeleton对象
把结果再Marshaling回客户端的Stub对象,经由Stub对象回复数据格式后,再回传给客户端的应用程序。
动态调用(Dynamic Interface Invocation DII):客户端不需要先有stub对象,也不需要知道远程corba对象提供的方法和属性,corba程序可以在执行时取得这些信息,然后动态的调用corba对象。
DII比静态调用有更大的弹性,但编程较难,且执行效率不如静态调用。
3:corba提供的核心服务
n Event Service: 以“提供者—消费者(Supplier_consumer)“模型通过一个事件信道然提供者对象以异步的方式传递事件给消费者对象。
n Naming Service: 允许程序员使用阶层式的方式为企业对象命名,然后在程序中可以使用这些有意义的名称来存取这些对象。
n Transaction Service:提供分布式应用系统能够执行关键任务,允许企业对象在异质平台和数据库之间进行数据的Two-Phase Commit的交易管理。
n Security Service :包括存取控制(Access control),稽查控制(Auding),认证控制(Authentication),存取政策控制(Plicy Control).
MIDAS介绍
一:MIDAS概念
MIDAS (Multi-tier Distributed Application Services Suite (多层分布式应用程序服务器)) 是开发多层应用系统使用的中介透明引擎。通过MIDAS,程序员可以通过相同的组件存取不同的后端应用程序服务器(如,COM/DCOM应用程序服务器,CORBA应用程序服务器,MTS中介软件),MIDAS也提供容错能力,负载平衡以及高执行效率的能力。
中介者和功能:
u 远程数据中介者(Remote Data Broker):提供客户端存取远程数据的能力。
u Constraint中介者:允许客户端应用程序下载远程数据库对数据设定的constraint。让数据在客户端被数据库的constraint检查。减少网络流量。
u 企业对象中介者(Business Object Broker):允许应用系统开发执行企业逻辑的企业对象。
u 容错能力:当一个客户端联结的应用程序服务器发生错误时,企业对象中介者就会在网络中寻找另一个提供相同功能的应用程序服务器,将客户端联结到该应用程序服务器上,客户并不知道发生的一切。这时必须使用无状态对象。
u 负载平衡:当客户端多于服务器数目时,企业对象中介者自动平衡服务器的连接数目。
二:数据处理
应用程序服务器从数据库取出客户端想要的数据,进行数据封包(data packet),通过Iappserver接口以OleVariant的形式传递给客户端,到达后,通过客户端的MIDASServer整理,加入到ClientDataSet的数据快储内存中,这时,客户端于应用程序服务器的连接断开。
在客户端应用了TclientDataSet的ApplyUpdates方法要求更新时,MIDASServer把更新之前的数据封装在数据封包中,然后再封装被更新的数据(只含被改变的),当应用程序服务器收到这些Delta数据封包之后,Resolver先将其解析,
然后对于每一笔更新的数据,Resolver首先根据第一笔封装的原始数据到数据库中寻找纪录,如果纪录已经被其他用户改变了,MIDAS会把原来客户端传来的数据和数据库中最新的这笔数据一块传回客户端,要求用户决定如何处理。
如果数据更新失败,则MIDAS会把发生问题的数据封装在数据封包之中传回客户端
http://www.myfaq.com.cn/A/2001-11-01/3464.html
Delphi5.5的MIDAS编程(客户端) |
|
badsky 时间:2001-11-01 10:40 出处:互联网 责编:My FAQ |
|
摘要:Delphi5.5的MIDAS编程(客户端) |
|
<script charset="utf-8" src="http://www.myfaq.com.cn/images/ad.js" language="javascript" type="text/javascript"></script> <script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> |
Delphi5.5的MIDAS编程office:office" />
l 数据层:负责存储数据
l 业务层:负责从数据层获取适当格式的数据并执行最后的合法性检查(也叫做执行业务规则)。业务层也就是应用服务器层。
l 表示层:也叫做GUI层,负责在客户应用程序中以适当格式显示数据。总是与业务层打交道,不直接与数据层打交道。
Delphi下多层体系结构的优点:
1. 业务规则集中:业务规则放在应用服务器上
2. 瘦客户体系结构:数据访问由应用服务器来控制,数据表示则由客户的应用程序完成。只需发布客户应用程序和一个用来访问服务器的DLL文件。
3. 自动错误调和
4. 公文包模式:公文包打开数据模式,允许不必一直与应用服务器或数据库服务器保持活动连接。
5. 容错
6. 负载平衡:负载平衡的算法有随机法、顺序法、最少网络用户和最少网络流量等。Delphi4及以上版本提供了一个顺序法实现负载平衡的组件。
典型MIDAS体系结构:
窗体/数据模块 远程数据模块(RDM)
客 户 服 务 器 |
TdatasetProvider TDataset |
TclientDataset
TDispatchConnection |
office:word" />
一、 服务器
二、 客户端
Delphi中用于连接客户和服务器的是TdispatchConnection。通过它的AppServer属性,可以调用服务器上自定义的方法。TdispatchConnection派生了几个子类,分别有不同的连接特性:
1. TDCOMConnection:通过标准Windows服务,提供安全验证的核心。对于intranet/extranet应用程序尤为有用。就需要在中间层应用服务器配置DCOM的安全验证,用dcomcnfg.exe。缺点有:
难于配置,主要是在跨route或网域,分布也困难
不能很好兼容防火墙
在WIN95机器上要安装DCOM95
2. TsocketConnection:易配置,只使用一个端口进行传输。必须运行ScktSrvr进行配置。Delphi4下要求安装WinSock2,Delphi5下不使用回调,可以用WinSock1连接用户。
3. TOLEnterprisdConnection:提供内嵌的容错和负载平衡。进行容错和简单负载平衡的组件TsimpleObjectBroker。可把WIN9X作为服务器。
4. TCORBAConnection:相当于DCOM的开放标准。
5. TwebConnection:允许MIDAS在HTTP或HTTPS上进行数据传输。限制有:
不支持回调
客户必须安装WININET.DLL
服务器端必须运行IIS4.0或Netscape3.6及以上版本
客户端程序的编写可以有多种方式:
1. 主窗体为ActiveForm,调用其它普通窗体的方式。ActiveForm实际上也是一种ActiveX组件,它同时也是一个ActiveX的Container对象。这就是说它可以包含其它的组件。这样我们就可以把普通的VCL控件加入到ActiveForm中。
ActiveForm的创建和发布:
在Delphi中选New|ActiveX|ActiveForm
aspectratio="t" v:ext="edit">
其中的Make Control Licensed选区项要注意,一般不选,否则ActiveForm在客户端下载时就需要License,就是要把开发机器上的License文件拷贝到客户端机器上。Include Version Information选项一般要选上,这样客户端在运行程序时就可以根据服务器上的版本号决定是否下载新的版本了。
创建并编辑完窗体后,就可以发布了。首先要在服务器上安装IIS,创建一个虚拟目录,准备放ActiveForm发布后生成的一些文件。选Project|Web deployment Options
这里是发布的各种设置。Targer dir是生成的一些文件存放在目录,Targer URL是客户机器访问服务器的URL,HTML dir是生成的ActveForm访问的主页存放目录。Use CAB file compression选项,选中时,ActveForm将打成CAB文件下载到客户端,不选中时,将编译成.OCX文件。Include file version number选项和创建ActveForm时一样,指发布时是否包含版本信息给客户端比较。Auto increment release number选项,一般要选中,这样程序每发布一次就会把版本号自动增加。这样客户端就可以比较后下载新版本。Deploy additional files选中的话,发布程序将包含Additional files页中添加的其它文件,如MIDAS.dll。
这些设置好之后,就可以点Project|Web deploy发布了。
有了一个ActiveForm, 再通过ActiveForm调用普通的Form,就可以方便建立基于IE运行的application了。可在ActiveForm创建时,创建普通的窗 体,再show出来,但这样,Form是独立在IE外的。如果创建同时,把Form的Parent设为ActiveForm,并设 Form.visibal:=true,这样这个普通窗体就显示在ActiveForm上了。当然最后不要忘了在ActiveForm的destroy事 件,把Form释放。通过这种方法,可以把任何普通的程序,转变为基于IE的应用程序。
使用ActiveForm为主的应用程序时,应为程序首次执行要下载ActiveForm,这样在某些速度较慢的网络上,要考虑ActiveForm文档的大小是否可以接受。下载时间过长,可能会造成DCOM或Socket逾时的情况。可使用Package和CAB技术使文档变小,但这毕竟有限。另外的办法是,程序员分析和设计整个应用系统,把共享的应用程序逻辑编写成企业对象,执行在应用程序服务器中,在ActiveForm下载后执行。但这样如果频繁调用大量数据,有时会降低执行效率,可能也难以接受。所以具体怎么样处理,最重要的是程序员的经验和实验。
2. 全部窗体都使用ActiveForm。ActiveForm不是直接调用,而是把要调用的ocx当作一个Internet链接来调用的。这种方式,客户端要下载大量的ActiveForm,这在一般网络上是难以接受的,所以很少采用。
3. 使用WEB方式。
因为下载和执行效率的关系,ActiveForm并不适合使用在Internet上。但一般的ASP+角本语言,也只适合简单查询多层应用系统。现今最好的解决方法就是XML+角本语言(最好是JavaScript)+企业对象+中介软件,能够满足电子商务应用的需要。
Delphi5提供功能强大的InternetExpress技术来开发分布式Web应用系统。从客户端到服务器到中介软件都可以只用Delphi来开发,而且是基于XML的。
4. 普通窗体。必须安装客户端程序,无法达到客户端免维护的要求,一般不采用。