对象池的工作原理
当配置要池化的组件时,COM+ 将在池中维护该组件的实例,以便可供请求该组件的任何客户端激活。 任何对象创建请求都将通过池管理器进行处理。
池按组件配置和维护。 池由共享相同 CLSID 的同质对象组成。 唯一的例外是事务对象,在事务挂起时,维护的子池包含具有事务相关性的对象。
应用程序启动时,只要对象创建成功,池将填充到以管理方式指定的最低级别。 当客户端请求组件传入时,会从池中以先到先得的方式满足这些请求。 如果没有可用的池化对象,并且池还没有达到指定的最大级别,则会为客户端创建并激活一个新对象。
当池达到其最大级别时,客户端请求将排队,并从池接收第一个可用对象。 对象的数量(包括已激活和已停用的对象)永远不会超过最大池值。 对象创建请求将在管理指定的时间段后超时,以便你可以控制客户端等待对象创建的时间。 超时失败后,客户端将从CoCreateInstance 中收到错误 E_TIMEOUT。
如果可能,COM+ 将尝试在客户端释放对象后重复使用该对象,直到池达到其最大级别。 该对象负责监视其状态,以确定是否可以重复使用,并且会为 IObjectControl::CanBePooled 返回适当的值。
创建池化对象时,它会聚合到一个更大的对象中,该对象将管理对象的生存期。 外部对象在对象的生命周期中的适当时间调用 IObjectControl 上的方法,如下所示:
- 每当对象返回到客户端并在特定上下文中激活时,就会调用 Activate 方法。
- 每当客户端释放对象或停用激活 JIT 的对象时,就将调用 Deactivate 方法。
- 每当对象返回到常规池时,就会调用 CanBePooled 方法。 如果对象检测到某些可重用资源处于错误状态,则会返回 FALSE,并且池管理器将取消对象。
对象不一定需要实现 IObjectControl。 否则,将始终重复使用实例,直到达到池最大级别。
有关如何配置要池化的组件的详细信息,请参阅配置要池化的组件。
相关主题