【20110224-01】ArcGIS Server与非池化服务建立的 ArcGIS Server Internet 连接的速度非常慢 解决办法
今天做了一个非常简单的地图测试程序
服务发布在本机上-方式为非池化-程序连接采用ArcGIS Server Internet 方式 运行之后发现执行非常慢,查询esri帮助得到如下建议:
通过 ArcGIS Server 本地连接而非 ArcGIS Server Internet 连接来使用非池化服务。
Internet 连接以完全无状态方式使用服务。通过 Internet 发送的每个服务请求均会在服务的后端 DCOM 组件上生成上下文获取及发布。如果服务为非池化服务,则每个上下文发布都将造成服务实例的取缔,并对其进行重新创建。这种服务的运算量非常大,尤其是当客户端向服务发送多个请求时。例如,一个简单的 Web ADF 制图应用程序可能要连接到服务,以获取地图对象、MapDescription 和 ImageDescription,然后执行绘图请求。上述操作中的每一个都包括上下文获取和发布。如果服务为非池化服务,且客户端正在通过 Internet 连接该服务,则上述操作中的每一个都将造成服务实例的创建及取缔,从而降低性能。
现在问题又来了,当我采用ArcGIS Server Local方式连接资源的时候,连续2次打开页面后,第三次请求就不能显示地图,在此牵涉到池化和非池化以及Internet和Local两种连接方式的区别:
ArcGIS Server Internet:
ArcGIS Server Internet方式去连接GIS Server的时候,就相当于去连接标准的web service, 因此只有这些web service暴露出来的webmethod才可以调用,
因此通过ArcGIS Server Internet方式去连接得到某个服务的时候所能得到的功能是很有限的。如上所说,Internet 连接以完全无状态方式使用服务,通过 Internet
发送的每个服务请求均会在服务的后端 DCOM 组件上生成上下文获取及发布,Internet方式连接非池化的数据服务的时候,每个上下文发布都将造成服务实例的取缔,
并对其进行重新创建,说白了即必须是SOC.exe的频繁的取缔和创建,这种服务的运算量非常大,又是在地图显示之前,导致页面加载缓慢。
ArcGIS Server Local:
ArcGIS Server Local方式去连接GIS Server(这里讲的只是针对非池化)的时候,首先创建一个服务实例,成功连接地图服务后服务实例并没有被取缔。
到了这里有人或许 认为在浏览器关闭的时候会释放这个实例,其实不然,浏览器被关闭的时候GISServer服务器并不知道它被关掉了,session还一直有效,
所以这个服务实例还被占用着,直到session超时被服务器强制回收。如果服务实例全部被占用下一个请求将无法成功取缔实例,就会导致无法访问.
因此用local方式连接时 必须及时的释放服务实例