池事务对象

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

手动登记资源

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

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

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

关闭自动登记

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

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

实现 IObjectControl

参与事务的可池对象必须监视其持有的资源的当前状态。 如果对象检测到它处于不可重用状态(例如连接不正确),则它应返回 False for IObjectControl::CanBePooled。 这将产生放弃对象实例和注定当前事务的效果。

Transaction-Specific池

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

这样,特殊子池将保留包含具有特定事务相关性的对象。 当事务提交或中止时,这些对象将返回到没有事务相关性的常规池,可供任何客户端使用。

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

COM+ 对象构造函数字符串

控制对象生存期和状态

对象池的工作原理

使用对象池提高性能

可共用对象的要求