AGS 对象池和状态概要

    作者:Flyingis

    AGS是ArcGIS Server的简称,AGS开发首先要理解对象池和状态(object pooling and gis server state),ags帮助文档对此有很详细的描述,想在短时间内看完密密麻麻的英文字符、碎块代码和图片,有时会感觉有点头皮发麻,如果你对ags或ae开发有初步了解了,就花一点点时间看完下面的精简概要,适合当作随手的课堂笔记(注:概要笔记,不适合死抓概念讨论正确与否)。

    文章标题有两个名词:对象池、状态,就从他们入手。

    对象池,和数据库连接池概念类似,无非就是用一个大的容器,将一些已建立好的对象放入其中,随时听从调度,当请求的对象小于等于容器中最大对象数的时候,ags服务无需请求新的server对象,如果请求数大于容器中的对象了,sorry,只能耐心等待。获得请求速度的提升,必然要损失连接数的限制,有得必有失。

    状态,辞海中对于它的解释太多,在这里,认为server在有状态(stateful)情况下是可以改变的,无状态(stateless)情况下是不能改变的,因为它没有状态可以改:)我们所说的改变,指的是mxd服务里图层是否可见、渲染方式更改、数据的编辑。

    现在将两者结合起来,ags文档给出了如下建议:

    This aspect of stateful versus stateless use and server object sharing relates directly to the pooling model for the server object. The following programming rules apply to using server objects:
    (1)Client applications cannot change the properties of a pooled server object.
    (2)Client applications can change the properties of a non-pooled server object.

    稍加思考就会理解这种建议,在池化方式下,如果server对象是有状态的,那么当一个用户对其进行修改释放回对象池中后,后面调用该对象的请求将看到已经更改的server对象,如果每个用户都对调用的server对象进行了更改操作,对象池里面的对象就将显得杂乱不堪,每个用户访问到的都是不同的结果,在绝大多数情况下,这种现象都是不允许的,因此只有在非池化连接里,server对象拥有状态才更具有实际意义,因为不论对该server对象进行了什么操作,释放对象后该对象都将被销毁,下次调用时重新创建。

    现在联想到ags两种开发方式:SOAP API和AO API,前者只能进行无状态开发,后者无状态和有状态均可。可以看出这种设定是符合实际应用的,SOAP更多的应用于城域网/广域网的访问,通过http提供各种web服务,受网络带宽和安全性的限制,因此在池化方式下可以节省创建server对象的时间,无状态可以保证互联网上所有用户每次访问的数据是相同的,并且不能随意改动。AO API更适用于在企业内部使用,如Intranet,在无状态情况下,它的连接方式是SOAP OVER DCOM,更多的它通过arcgis server local连接方式应用于非池化的环境中,另外在非池化连接方式下,没有cache的地图浏览速度很慢,在城域网/广域网的范围内几乎不用考虑。

    什么情况下做什么样的选择已经有一个粗的框架了,最后看看ESRI对伸缩性、扩展性很强的server应用给出的建议:
    The question of stateful versus stateless use of the GIS server is central to the scalability of your application. An application is more scalable than another application if it can support a larger number of users with the same amount of computer resources. The keys to scalability are:
    (1)Make stateless use of the GIS server.
    (2)Use pooled server objects.
    (3)Minimize the time your application holds on to a server object. Release server objects as soon as possible and do not rely on .NET garbage collection to do it for you.

    补充一句:想在企业内部通过web实现arcgis桌面编辑、分析、管理功能,选择server ao api开发,非池化,有状态。

    最后祝各位giser和博客园朋友圣诞快乐!

你可能感兴趣的:(对象池)