池化事务性对象

要共用的事务性组件有特殊要求。

手动登记资源

参与事务的可可入池对象必须手动登记托管资源。 如果对象在客户端之间保留托管资源,则当对象在给定上下文中激活时,资源管理器将无法自动登记到事务中。

对象本身必须处理检测事务的逻辑,关闭资源管理器的自动登记并手动登记它拥有的任何资源。 执行此操作的步骤特定于正在使用的资源管理器。 如果需要手动登记,请参阅资源管理器的文档。

如下所述,当事务处于活动状态时,可以使用事务相关性来池化对象,如果客户端调用了与该事务关联的事务,则可以使用事务相关性激活对象。 在登记资源之前,应首先检查事务相关性。 如果对象已从特定于该事务的池中获取,则它已在该事务中完成工作并登记其资源。

关闭自动登记

自动登记应在获取资源后关闭,通常在对象的构造函数中关闭。 也就是说,禁用自动登记,然后再连接。

禁用自动登记有时可能是一个微妙的过程,尤其是在分层数据访问提供程序的情况下。 自动登记有时与连接池(如 ODBC)结合使用,有时与 OLE DB 不结合使用。 可能需要确保在多个级别的提供程序上关闭自动登记。

实现 IObjectControl

参与事务的可入池对象必须监视它们所保存的资源的当前状态。 如果对象检测到它处于不可重用状态(例如,如果连接不正确),则会为 IObjectControl::CanBePooled 返回 False。 这将产生丢弃对象实例和终止当前事务的效果。

特定于事务的池

对象池通常为同质对象,当前未使用的任何共用对象都可以返回到任何客户端。 这条规则的唯一例外是事务性对象,它针对对象池进行了优化。 请求对象的客户端具有关联的事务时,COM+ 将扫描池中已与该事务关联的可用对象。 如果找到具有事务相关性的对象,则会将其返回到客户端;否则,将返回常规池中的对象。

通过这种方式,可以维护特殊的子池,其中包含与特定事务具有相关性的对象。 当事务提交或中止时,这些对象将返回到没有事务相关性的常规池,可供任何客户端使用。

因此,当组件在事务中手动登记其托管资源时,应首先检查这些资源是否已经登记。 如果是这样,则无需登记。

COM+ 对象构造函数字符串

控制对象生存期和状态

对象池的工作原理

使用对象池提高性能

可入池对象的要求