关于池化与非池化的理解

来源:互联网 发布:情热传说游戏结局 知乎 编辑:程序博客网 时间:2024/05/22 15:01
 

用ArcServer肯定会遇到池化与非池的问题,而且比较难以理解,我总结了几种理解方式,可供参考。

一、首先看看Catolog上的说明:

池化:被许多用户重复使用;

非池化:被单一用户使用,使用完后被释放掉。

二、一个形象的比喻

一个水缸里有好多鱼,你想喂鱼。
池化是你任意抓住一条喂,喂了就放回去。
非池化是指定一条鱼让你喂,直到你不想再喂鱼,就把鱼杀了。

此比喻来自ESRI中国社区的一位网友,原帖http://bbs.esrichina-bj.cn/ESRI/thread-48027-1-1.html。

下楼有网友补充:
这个比喻有点意思,但是非池化还不仅是指定一条鱼的问题,事实是这条鱼原本并不存在,要现生成。所以从非池化获得鱼的速度比池化中从已有的鱼中任意抓一条要慢

三、详细解释

(来自ESRI中国社区)

安装了ArcGIS Server的机器,当打开任务管理器的时候,会看到里面有arcsom.exe和arcsoc.exe进程,但它们的数量具体是如何决定的呢?以下的分析仅针对单机配置的情况(假定所有部件都安装在一台机器上),对于分布式的安装,可以此类推。
        GISServer是由一个SOM(Server Object Manager)和若干个SOC(Server ObjectContainer)机器组成。SOM会在机器里以arcgissom账户启动一个ArcSOM.exe的进程,这个进程负责管理(启动和停止)其他SOC进程(ArcSOC.exe),SOC进程虽然是由SOM启动,但是以arcgissoc账户运行的。arcsom.exe启动时,会自动启动两个arcsoc.exe,一个用于记录AGS的日志,一个用于清空特定的工作目录。这两个arcsoc.exe在任务管理器中可以根据所占用的内存数与其他arcsoc.exe区分开来,如图,占用内存较少的两个arcsoc.exe便是由SOM进程自动启动的,而其他的arcsoc.exe则是由具体service启动的。

        插入一些概念。用户请求一个service时,是和该service的一个instance打交道。service有pooled和nonpooled两种。对于pooledservice来说,一个用户(或者应用程序)请求该服务时,会随机获得一个该服务已经创建的instance的引用,由该instance对请求做出响应;请求完成后,用户会立即释放该instance的引用,使其返回假想的instancepool中,用户发出另一个请求,重复上面的过程。如果是non pooledservice,用户第一次发出请求时,也会随机获得该service已经创建的一个instance引用,但请求处理完成后,该用户继续持有对该instance的引用,直到用户断开与服务器的连接(结束程序),该instance会被销毁,然后SOM会创建一个新的instance来维持数量。对于pooled service,又有low isolation和high isolation两种。highisolation是指service的每个instance都会独占一个进程(arcsoc.exe),lowisolation则是指一个进程内可保有多个(默认是8哥,最多可达256个)instance(就是所谓的多线程)。lowisolation的好处是可以启动相对少的arcsoc.exe来维持同样数量的instance,节约服务器的内存资源;但如果一个arcsoc.exe崩溃,那么里面的所有instance都会被销毁,即使用户正在使用它们。highisolation的优缺点则与之相反。一般来说,对于pooled service使用high isolation设置。non pooledservice的instance总是独占一个进程(同highisolation)。另外可以指定一个服务的最小和最大instance数目,服务启动时会自动创建最小数目的instance等待调用;当创建的instance数目达到最大数量时,所有的请求都会进入等待队列。
        至此,可以来分析一个具体的案例了。现在机器上总共有2个服务:
World:pooled,low isolation(8 instance per process),min-instance:9, max-instance:16   ,随机启动
China: non pooled ,min-instance:2, max-instance:4,手动启动。
        开机,SOM启动一个arcsom.exe,随后启动两个arcsoc.exe;World服务启动,创建9个instance,其中8个instance公用一个arcsoc.exe,剩下一个instance启动另外一个arcsoc.exe。此时机器中共有1个arcsom.exe,4个arcsoc.exe。此时手动启动China服务,创建2个instance,每个instance会启动一个arcsoc.exe。此时,机器中共有1个arcsom.exe,6个arcsoc.exe。
        观察统计可知,最小instance数量为1的服务启动时间平均在17秒左右(cpu:Intel T7200)。可以看出,对于经常不用的服务,我们可以将它设置成手动启动,一来节约内存,二来加快机器启动速度。

 

四、个人理解

池化与非池化主要是为了解决并发冲突的,特别是提供数据的在线编辑时。对于池化连接方式,当用户访问时,从SOM已经创建好的连接池中随机获取一个服务实例(就像从一个水池中随机抓住一条鱼),一旦请求结束立刻自动释放实例(就像鱼被放回池中);对于非池化连接方式,用户访问时,SOM会动态创建一个新的服务实例为此用户独自占有(就像失去了水池,不能抓鱼了),直到用户主动断开连接才销毁该实例。这样理解就可以解释为什么在线编辑时,池化服务不能使用undo,redo了,就是因为每次编辑请求结束后,该实例已释放,数据已保存,而非池化服务中,用户独自占有一个实例,所有的编辑操作只对此实例产生影响,并未保存到数据库中,只在用户主动保存数据(相当于断开连接)时,数据才被保存,实例被销毁。

以上为个人理解,仅供参考,如有不对之处,请指正。

原创粉丝点击