MTS中共享属性管理器(SPM)在分布式计算环境中解决并发问题时所起的作用,并以一个实例详细说明了SPM的使用方法。 1概述在分布式应用中,编写能在并发环境中正确工作的应用程序是一项件较困难的工作。微软的事务服务器(MTS,MicrosoftTransactionServer)在这方面给用户提供了一个很好的解决方案,使开发人员能将精力集中在编写自定义的商业逻辑上,将其它问题交给系统解决。 在并发环境下,用户不能简单地使用全局变量来保存共享信息。这是因为并发以及命名冲突等潜在的问题会造成所需的数据和实际获得的数据不一致。SPM通过提供共享属性组(Shared PropertyGroups)为组中的所有共享属性建立独一无二的名称空间来消除名称的冲突;同时,SPM应用锁和信号量机制保证共享数据在并发情况下提供用户正确的结果,大大减轻了用户开发并发应用程序的复杂度。 客户机上的应用程序,该程序调用MTS对象提供的服务;客户端(Client)“则指任何调用其它MTS对象的MTS对象。说明了基础客户端和客户端的概念。 基础客户端和客户端当基础客户端调用对象1时,对象1再调用对象2.此时,对象1调用了其它MTS对象提供的服务,因此对象1就是一个客户端。 存储在SPM中的共享属性只能被那些在同一进程中运行的对象所访问。因此,应从客户端(即MTS组件)来使用SPM,而不要从基础客户端去使用它。如果共享属性是由一个基础客户端创建的,那么它们将被安置在基础客户机的进程中,这可能不是我们所期望的。 2应用方法SPM的对象模型如所示。为了防止在不同组件创建的属性之间发生命名冲突,SPM定义了“共享属性组”的概念。一个“共享属性组”为一组共享的属性建立一个名称空间。每个属性在该组内有一个名称、值和位置。名称或位置可以用来检索属性的值。可以通过“共享属性组管理器”来访问和创建共享属性组。 SPM的对象模型在创建一个组时,可以指定SPM怎样管理对组内属性进行并发访问。如果isolation mode(隔离模式)被设置成LockSetGet,那么当一个属性值被读或写时,SPM就对该属性加锁。这种设置,可保证两个客户不能同时读或写相同的属性,但武汉科技大学学报(自然科学版)它并不阻止客户并发地访问同一组里的不同属(隔离模式)被设置成LockMethod,那么在当前的方法调用期间,一个组中的所有属性将被加锁,以保证该客户可以排他地使用这些属性。当组内属性之间有相互依赖关系时,或者当一个客户需要保证一个读/写操作不被中断时,这种加锁功能就很有用处。 在创建组时,也可以指定组内的属性何时被销毁。如果release mode(释放模式)被设置成Standard,那么当所有客户刚一释放它们对该属性的引用,该属性就被销毁。如果release mode(释放模式)被设置成Process,那么直到进程终止时,这些属性才被销毁。在默认情况下,经过三分钟没有活动,MTS将会关闭一个进程。如果正在使用SPM,可能想为服务器程序包增加超时时限,以减少必须重新对SPM进行初始化的次数。 为了使用SPM,必须先创建“共享属性组管理器”的一个实例。在VisualBasic中,可以通过设置一个对Shared PropertyManagerTypeLibrary(共享属性管理器类型库),即MTXSPM.DLL的引甩并且创建一个新的SharedPiopei-tyGroupManager对象来完成这项工作。如下面的程序代码所示:一旦创建了组管理器的实例,就可以调用它的CreatePropertyGroup方法,以便用一个给定的名称创建一个新的共享属性组。创建组后,使用CreateProperty方法来创建共享属性;或通过在该组中的位置,利用CreatePropertyByPosition方法来创建共享属性。如果这一共享属性已存在,那么这两种方法都将返回一个对已存在的共享属性的引用,然后可以利用其Value属性来获取或设置数据的值。Value是一个VARIANT属性,可以把任何标准的Automation类型存储到共享属性中。 3应用实例下面用一个实例来说明SPM的使用方法。 实例代码是用Visual Basic编写的,后台数据库采笔者为本单位开发“合同管理”项目时,曾编写过一个组件bus- TakeANumber,用来管理厂家编号和分类编号。示出与该组件相关的三个r糸产,笑名称van.lvu(仙分类知号i|U与例子有关的三个数据库表由于要求厂家编号与分类编号按部门进行维护,即当每个部门添加厂家信息或产品类别信息时,该组件将产生一个长整形数字作为厂家编号或分类编号(该编号是在原表中的最大编号上加一形成的)又因为各部门可能同时有几个人在输入数据,为了避免并发问题形成重复的编号,故考虑使用SPM对编号进行维护。TakeANumber表主要是用来将共享信息暂存到数据库中,以便系统突然崩溃时或在服务器进程被MTS关闭前能将共享信息保存下来,从而在SPM再次启动时能获得最近使用过的信息。 程序的设计思想为:为每个部门建立一个‘共享属性组“,以部门编码作为名称空间;每个属性组中设两个属性,即厂家编号和分类编号。当需要某个编号时,便从共享属性值中读取该值,并将原属性值加一后存入该共享属性中,同时将该属性值存入数据库作为备份,以备不时之需。 个组件请求获取的厂家编号或分类编号。程序代码如下:Manager‘创建共享属性组管理器的一’定王晓亮,等:共享信息机制及应用方法一个实例‘创建共享属性的一个实例=NewADODB.Connectionconn.Open“FILEDSN=”fileDSN’通过DSN文件建立数据库连接‘如果bResult为true说明该共享属性组已存在;否则为一个新建的属性组,这时从数’据库中读取备份的数据作为共享属性If回该属性值‘将原属性值加一作为下一个返回值’备份该属性值(存储到数据库中)作为不时之需‘错误处理在上面的方法中,属性组的隔离模式使用了LockMethod,释放模式米用Process(进程级)。 GetANumber来获取产品分类编号(这里以获取分类编号为例,厂家编号的获取方法与之相似)。其中,变量U-nitCode为部门编码,ProdSort为产品类别编号,SortName为产品类别名称。Add方法完成的任务是将新的产品类别名称及分类编号存入表“产品类别”中。程序代码如下:ProdSort=EmptyThen‘将UnitCode强制转换为字符串,并建立一个以该字符串为名称空间的属性组;Into产品类别武汉科技大学学报(自然科学版)在这个组件中,创建了bus―TakeANumber的一个实例,用来产生一个与部门相关的独一无二的产品分类编号。 现在,可以在客户端应用程序中调用上面两个组件来完成所需的功能。以下为一个客户端应用程序片断,它调用了组件bus-PiodSortWrite中的方法Add将部门编码为104、产品类别为“起重机”这一类别信息写入数据库:4结束语本文主要讨论了MTS的共享信息机制SPM在处理并发问题上的应用。实际上,MTS的SPM的作用不只局限在解决分布式应用中的并发问题,只要是不同组件之间需要共享信息,都可以采用SPM方法,至于具体功能的实现,可参阅有关资料。
|