對象共用的運作方式
當您將元件設定為集區時,COM+ 會在集區中維護它的實例,可供任何要求元件的客戶端啟用。 任何物件建立要求都會透過資源池管理器來處理。
集區是根據每個元件來設定和維護的。 集區是由共用相同 CLSID 的同質物件所組成。 唯一的例外狀況是交易物件,其中子集區會保留包含交易暫止時具有交易親和性的物件。
當應用程式啟動時,集區會被填滿至您由系統管理層面指定的最低層級,只要物件創建成功即可。 當元件的用戶端要求傳入時,會先從集區先到先得地滿足這些要求。 如果沒有集區物件可供使用,且集區尚未達到其指定的最大層級,則會為用戶端建立並啟動新的物件。
當集區達到最大層級時,用戶端要求會排入佇列,並從集區接收第一個可用的物件。 物件數目,包括啟動和停用,永遠不會超過集區值上限。 物件建立要求會在系統管理指定的期間之後逾時,以便您可以控制用戶端等候物件建立的時間長度。 發生逾時失敗時,用戶端會從 CoCreateInstance取得錯誤E_TIMEOUT。
在可能的情況下,COM+ 會在客戶釋放物件後嘗試重複使用該物件,直到集區達到最大容量為止。 物件負責監視其狀態,以判斷是否可以重複使用,而且應該傳回適當的值給 IObjectControl::CanBePooled。
建立集區物件時,它會匯總成較大的物件,以管理物件的存留期。 外部物件會在適當的時機點於物件生命週期中,於 IObjectControl 上呼叫方法,如下所示:
- 每當物件在特定的上下文中被啟動並傳回給用戶端時,就會呼叫 Activate 方法。
- 每當客戶端釋放物件或停用 JIT 啟動的物件時,就會呼叫 Deactivate 方法。
- 每當對象傳回一般集區時,就會呼叫 CanBePooled 方法。 如果對象偵測到某些可重複使用的資源處於不良狀態,則應該傳 回此方法的 FALSE,而集區管理員會捨棄物件。
物件不一定需要實作 IObjectControl。 如果沒有,例項會一直重複使用,直到達到池的最大限制為止。
如需如何設定要集區之元件的詳細資訊,請參閱 將元件設定為集區。
相關主題
-
使用物件共用 改善效能