這兩個技術是用來減少伺服器端, 因大量的用戶端連接而佔用的資源, 是互相輔助的;
當Client端向COM+要求建立COM實例, 而取得一個接口時, 此接口並不是直接取自該實例的
接口, 而是由COM+依照原接口所建立的轉接接口 (微軟對此有一個名稱ObjectContext);
當
Client端向該接口調用方法時, COM+才會給予一個實例, 並執行該實例的對應的方法;
在
該方法調用結束後(如果在該方法最後有調用SetComplete或SetAbort), 該實例即會還給
COM+, 而Client只保留轉接接口(所佔的資源較少), 這是即時激活的概念;
因為此狀況,
所以前端對同一接口每次的方法調用, 所使用的對象實例並不相同, 所以程式運行所需的資訊,
不能存放在COM實例中, 這是無狀態對象(Stateless)概念;
COM+如何處理對象實例? 在每次Client方法調用時, COM+必需分配一個對象給該需求, 而在
方法調用結束後,該對象也就還給了COM+, 最佳的方法, 是將這些對象保留在緩沖池中, 需
要時取出, 不用時再放回, 供其它呼叫使用, 以減少反覆建立對象、消滅對象所耗費的時間,
這是對象緩沖池(Object pooling)的概念;
目前MTS, 2000 COM+均沒有實現對象緩沖池功能, 所以每次的方法呼叫, 對象是不斷的被
建立及釋放, 所以如果對象建立時, Initialize所花費時很長, 那應用程式一定會沒有
效率;
另外一個要注意的是, 如果以Delphi的MTS Data Module來製作COM+ Dll, 不要將
DataModule上的Dataset的Active設定為True, 因為會導致在每次建立對象時, 就會重新
回資料庫取資料, 如果DataModule上的dataset多, 或客戶端的資料量大, 那效率好的起
來才有鬼!? 只要在方法調用中, 有用到時, 再去Active所需的dataset即可!!
目前已知, 只有微軟出的Application Center Server才有Object pooling功能;
因為有一陣子沒有碰三層式設計, XP的COM+不知道已實踐了此功能沒有?