转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> SyBase >> 正文
PowerBuilder应用开发系列讲座(35)         ★★★★

PowerBuilder应用开发系列讲座(35)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:775 更新时间:2009/4/22 22:54:22
p align="center">分布式应用开发

  在第8期中,我们曾经介绍了开发一个简单分布式应用的 步骤,这里我们不再赘述开发的全过程,只是就其中的主要内容再重点说明一下。

不可视对象(NVO)及其代理对象(proxy)

  不可视对象:不可视对象最早在3.0中引入,功能在以后的每一个版本中都得到一定的加强。简单的说,不可视对象是一个进程对象。在这个对象中,没有任何可视的成份,因此而得名。不可视对象可以是一个事务处理的对象。由一些事务处理函数组成,并有一个方法集作为外界访问接口。用户通过这个由函数和事件组成的方法集调用事务处理函数。在分布式PowerBuilder中,我们将这样的不可视对象放在了远端。使事务处理的函数在应用服务器中或者说在另外的一台计算机中运行。

  代理对象:我们在不可视对象的外部增加了一层包装,把这一层作为编程的接口层(API)。这就是该不可视对象的代理对象(proxy),代理对象作为不可视对象的最外层包装,有与该对象相同的public访问特性的方法和属性。将实际的对象与代理对象分离开,这就形成了分布式的结构。不可视对象所进行的事务处理放在了应用服务器上,而它的代理对象放在了客户端。

  在客户端,用户对代理对象进行操作,但这只是不可视对象的一个API接口,它并不包含真正的方法。代理在内部重新调用运行在远端的对象的方法。在服务器一端,运行着的是一 个真正的不可视对象,它同普通的不可视对象没有任何不同 之处,只是对这个不可视对象的调用是在客户端通过它的代理进行的。每一个运行在服务器端的对象在客户端都必须有 它的代理,这个对象才能够被该客户端的应用程序所调用。 一个应用服务器可能会有多个客户机,这样在一个服务器上的不可视对象就可能在客户机上有多个不同的代理。 连接对象(connection)及传输对象(transport)

  介绍了服务器端的不可视对象和客户端的代理对象这两 个在分布式应用中的对等部分,接下来我们要考虑的是如何将这两个部分建立连接。在连接的过程中,我们就要涉及另两 个对等的对象,这就是在PowerBuilder5.0中新增加的两个对象类型:连接(connection)及传输(transport)对象。connection对象是在 客户端用以同服务器进行通讯的对象,反过来,transport对象是驻留在服务器端用以同客户端应用进行 兜亩韵蟆?/p>

  connection对象:我们可以将这一对象同用在数据库事务的 transaction对象进行类比。我们通过定义transaction对象的属性连接某个数据库服务器。在客户端的应用中,用数据窗口或直 接使用SQL访问数据库服务器时,我们须使用SetTransObject()函数或USING关键词来指定这个数据窗口所使用的transaction对象。同 理,分布式事务中,客户端的代理对象就如同一个数据窗口,我们也应当指定代理对象同哪个服务器进行通讯。因为正如 一个数据窗口可以访问不同的数据库服务器一样,一个代理 对象也可以代理不同应用服务器上的不可视对象,而其中的connection对象就象transaction对象一样,它的属性就是用以区别 不同的服务器。在connection对象中最重要的三个属性是application、driver、location。driver属性是用以指定我们所使用的通讯 协议,目前支持的是TCP/IP和NamedPipes;location属性是应用服务器的名称。

  象事务对象中使用CONNECTUSINGSQLCA一样,接下来我们调用 一个connection的对象函数ConnectToServer(),建立客户和应用服务器的连接。也正如事务对象一样,在调用这个函数后,我们应检验connection的返回值,以确认连接是否成功。connection对象同服务器建立连接后,客户端即可同服务器进行通话。下一步 我们指定代理对象使用哪一个连接对象。这就好比是在数据 窗口中使用SetTransObject函数将数据窗口和事务对象建立联系, 代理对象使用的的是SetConnect()函数。一个PowerBuilder的应用可 以同时连接多个数据库服务器,同样在分布式PowerBuilder中,您也可以同时建立多个连接对象,每个连接对象同不同的应 用服务器相连,使一个客户端应用可以同时访问多个应用服务器。

  传输对象:在客户端我们使用的是connection对象同服务器 进行联系,而在服务器端我们使用的是transport对象同客户端进行连接。transport对象用以指示本应用服务器的一些属性值,并且飧鲇τ梅衿髌舳鹄础ransport也有着两个重要的属性application和driver。同样driver是指TCP/IP或NamedPipe协议, 而application是指正在监听的应用名称。启动服务器的函数是listen(),执行了这个函数后,在服务器端就增加了一个进程用 于监听任何客户端的请求。

分布式PowerBuilder的工作原理

  当一个connection对象调用了ConnectToServer函数成功后,服务器端将在内存中开辟一个用于该客户端应用的工作区,而在proxy对象调用了SetConnect函数后,系统将在服务器端初始化一个不可视对象的实例,注意系统并不是在用户初始化代理对象时初始化不可视用户对象的,而是在调用SetConnect函数后,在服务器端对NVO进行初始化的。

  分布式PowerBuilder在服务器一端实现的是一个虚拟机模型。每当一个客户请求连接时,服务器就会在内存中建立一个新的区域用于该客户的请求,每一个内存空间都是相互独立。在PowerBuilder5.0中分布式应用只支持同步方式,也就是说,当您调用代理对象的一个函数时,系统实际将调用服务器端的不可视对象的函数。这时客户端应用将被挂起,直至服务器函数运行完毕,客户端才能继续工作。而在即将发布的6.0中将支持异步运算。

  当您调用一个客户端函数时,您一定需要传递参数给这个函数。目前的分布式PowerBuilder版本可以支持多种数据类型的传递:所有简单的数据类型,结构和数组,使用传值法和传参法。还支持传递不可视对象。不过不能以引用方式传递对象,例如您不能在分布式中传递一个窗口或一个数据窗口的句柄 。

  当我们在使用完一个代理对象后应注意在程序的结束前用destroy语句析构这个对象实例,否则将出现我们在第13期曾 经讨论过的内存漏洞(memoryleak)的问题。而这一点在分布式中尤为重要。因为对代理的析构将使远端的不可视对象同时 析构。如果您忘记了对代理对象的析构,不可视对象将不会在服务器端自动清除,这样您将在客户和服务器两端都造成了内存漏洞。此外connection对象还有一个DisconnectServer函数,这个函数用以取消客户与服务器的连接。服务器端将回收分配给 该用户的内存,在程序结束时不使用这个函数也将造成服务器器端的内存漏洞。在客户端产生了内存漏洞也许并不会造成多么恶劣的影响,在服务器端有一个10K左右的漏洞可能也 算不得什么,但是如果每一次的客户调用NVO函数都造成10K的漏洞,一个客户机每天有100次的调用,这个服务器如连接了100个客户机,那么一天之内就会造成102.4M的内存漏洞,这足以使任何强壮的服务器崩溃。


开发分布式应注意的问题
在本地进行分布式设计
  我们在做数据库模型设计时,首先设计的是实体与实体之间关系,我们将不考虑每一个表、每一个字段的具体实现,这时我们称之为概念设计阶段,然后再考虑其物理实现。同样我们在设计分布式应用时也应首先考虑在本地上的实现,如过早地考虑网络的拓扑模型将会使得您的分布式应用失去未来重新分割应用的灵活性。应用在分布运行之前首先应当在 本地成功运行,使用Debug调试必须使用本地的接口。同产品相同的开发环境当开发环境与实际交付用户运行的环境有显著差别时,会使得这个应用在成为产品时,分布式应用部分根本不可用。例如,一个在小型的高速局域网环境中开发出来的应用,如工作在一个拨号网络或一个广域网中。也许就不会有象期望的那样有理想的运行效果。

使网络通讯量最小化

  在物理对象设计和实现过程中最基本的目标是减少分布式应用中代理之间的消息和代理对象的传递。函数调用,对远过程对象中实例变量的引用,触发远过程对象的事件等操作都要比引用本地对象花费更多的时间。

PowerBuilder对象库的分布

  一般建议在开发时,将不可视对象及其代理对象放在同一个pbl库中,这个库都包括在客户端应用和服务器端应用可搜索到路径中。这样在对象被修改后,运行时的两端的应用就可以使用同一个DLL或PBD。

同时检入(checkin)和检出(checkout)NVO及其代理对象
  在团队开发中,一个程序员检入NVO时,应当同时检入它的代理,即使您不打算修改这个对象的接口函数,PowerBuilder在保存NVO对象时,会同时重新修改保存在同一个pbl库中的这个对象的代理,因为代理对象不仅带有接口函数的信息,还包括了对象的实例变量等其它信息在内。

建立一个远程控制机制

  在一般情况下,应开发一个应用服务器的远程设置,控制新用户连接,启动,关闭和其它日常任务维护的控制功能,以便于管理员对应用服务器的管理。

上期错误更正

  在8月25日所刊出的第32期中,我们介绍了为下拉式数据窗口建立数据缓冲服务器,我们也可以使用分布式PowerBuilder将这个小应用分成两部分,把缓冲区建在应用服务器上。只要对原文中的部分代码稍加修改就可以完成这个分布式应用。不过在该文中的wf_find_dataobject函数却有一个严重的错误,笔者误将应当用在datawindow中的代码用在了这里。准确的代码应当是将原程序中第14行至第16行该为:

lds_new_entry=createu_dsa
IFIsNull(lds_new_entry)THEN
RETURN0
ENDIF

  衷心地感谢向我指出这一错误深圳现代计算机公司的刘伟青先生,同时,对该文的读者表示深深的歉意。


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台