可入池对象的要求

可入池对象必须满足某些要求,才能使单个对象实例可供多个客户端使用。

无状态

为了维护安全性、一致性和隔离性,可入池对象不应保留客户端到客户端的特定于客户端的状态。 可以使用 IObjectControl 管理任何每客户端状态,使用 IObjectControl::Activate 执行特定于上下文的初始化,使用 IObjectControl::Deactivate 清理任何客户端状态。 有关更多详细信息,请参阅控制对象生存期和状态

无线程关联

可入池对象不能绑定到特定线程;否则,可能对性能造成灾难性影响。 因此,可入池对象不能标记为在单元模型中运行;而必须在多线程单元或中性单元中运行。 此外,可入池对象不应使用线程本地存储,也不应聚合自由线程封送处理器。 有关 COM+ 中的线程的更多详细信息,请参阅 COM+ 线程模型

注意

Microsoft Visual Basic 6.0 和更早的开发环境只能创建单元模型组件。 但是,在 Visual Basic .NET 中,可以池化组件。

 

aggregatable

可入池对象必须支持聚合,即必须使用非 NULL pUnkOuter 参数调用 CoCreateInstance 来创建。 当 COM+ 激活池化对象时,会创建一个聚合来管理池化对象的生存期,并在 IObjectControl 上调用方法。 有关编写可聚合对象的详细信息,请参阅聚合

事务性组件

参与事务的可可入池对象必须手动登记托管资源。 如果池化,如果对象包含托管资源(例如数据库连接),则当对象在给定上下文中激活时,资源管理器将无法自动登记在事务中。 因此,对象本身必须处理检测事务的逻辑,关闭资源管理器的自动登记并手动登记它拥有的任何资源。 此外,事务池化对象应在 IObjectControl::CanBePooled 的参数值中反映其资源的当前状态。 有关详细信息,请参阅池化事务性对象

实现 IObjectControl 来管理对象生存期

可入池对象应实现 IObjectControl,尽管不是严格要求这样做。 但是,池化的事务性组件必须实现 IObjectControl。 这些组件应监视它们保存的资源的状态,并指示何时无法重复使用它们;当 IObjectControl::CanBePooled 返回 false 时,它将破坏事务。 有关更多详细信息,请参阅控制对象生存期和状态

语言限制

使用 Microsoft Visual Basic 6.0 及更早版本开发的组件无法池化,因为这些组件将是单元模型线程化。 但是,在 Visual Basic .NET 中,可以池化组件。

旧版组件

只要这些组件是非事务性组件,并且符合上述适当要求,即使在编写时没有特别考虑池化功能,也可以进行池化。 不需要实现 IObjectControl;不这样做的组件将无法参与管理其生存期。 如果未实现 IObjectControl::CanBePooled,则对象将继续重复使用,直到池达到最大大小。

COM+ 对象构造函数字符串

控制对象生存期和状态

对象池的工作原理

使用对象池提高性能

池化事务性对象