控制对象生存期和状态

共用对象可以通过实现 IObjectControl 参与 COM+ 如何在池中管理其活动。 创建共用对象时,会将其聚合为更大的对象,该对象将通过在对象生命周期中的常规点调用 IObjectControl 的以下方法来管理对象:

  • Activate - 每当将对象返回到客户端并在特定上下文中激活时,就会调用。
  • Deactivate - 每当客户端释放对象或停用激活 JIT 的对象时,就将调用。
  • CanBePooled - 每当对象返回到常规池时,就会调用。

实现 IObjectControl 是可选的,但事务对象除外,事务对象应始终实现 CanBePooled,才能监视它们持有的资源的状态。 但是,在大多数情况下,建议实现 IObjectControl,因为它提供一种高效的方法来管理共用对象的行为,如下所示。

执行特定于上下文的初始化

使用 Activate,可以在为给定客户端激活对象的上下文中初始化该对象。 例如,若要确定对象是否具有事务相关性(其资源可能已登记),可能会获取与上下文关联的事务 ID。

通常,使用 Activate 执行初始化,该初始化在对象公开的任何方法中保持一致,从而将其视为对象的构造函数的上下文特定部分。

清理任何客户端状态

使用 Deactivate,可以删除可能存在的任何客户端特定状态,以便对象以完全通用的状态返回到池,然后可由任何客户端使用,而不会损害安全性或隔离。

控制对象的重用

使用 CanBePooled,可以监视对象的内部状态,并报告它是否适合其重用。 如果 CanBePooled 返回 True 且尚未达到池最大值,则将对象放回常规池中。 如果 CanBePooled 返回 False,则将放弃对象。 对于事务组件,返回 False 将破坏当前事务。

通常,将保留对象的一些全局数据成员,并且如果检测到连接不正确或某种资源处于错误状态,请将其设置为反映当前情况,并通过 CanBePooled 将其返回。

如果对象未实现 CanBePooled,则将继续重用实例,直到达到池最大级别。

COM+ 对象构造函数字符串

对象池的工作原理

使用对象池提高性能

池化事务性对象

可入池对象的要求