用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了,就是因為每次編輯請求結束後,該執行個體已釋放,資料已儲存,而非池化服務中,使用者獨自占有一個執行個體,所有的編輯操作隻對此執行個體産生影響,并未儲存到資料庫中,隻在使用者主動儲存資料(相當于斷開連接配接)時,資料才被儲存,執行個體被銷毀。
以上為個人了解,僅供參考,如有不對之處,請指正。