COM+ 资源分配器概念

应用程序组件使用 COM+ 资源分配器来访问和管理共享的非持久状态信息,例如组件与给定的资源管理器之间的连接。 在运行时,资源动态池(例如数据库连接、网络连接、与队列的连接、线程、对象和内存块)可供资源分配器使用。 应用程序进程通过使用最少数量的常用资源来实现高性能。 资源分配器还可以自动执行事务和回收。 (有关此功能的详细信息,请参阅自动资源回收

注意

资源是资源分配器创建的任何内容。 例如,与资源管理器的连接是一种常见资源。 资源驻留在资源分配器的内存中,永远不会复制到分配器管理器。 资源仅由不透明句柄 (RESID) 所知,并且可能能够也可能无法执行事务。 尽管托管的资源通常与管理持久状态的组件建立连接,但连接本身并不持久。 资源分配器通常使用相关的资源管理器来保留持久状态。

 

从体系结构上看,COM+ 资源分配器系统由资源分配器和分配器管理器组成。 资源分配器是用户提供的组件,为应用程序提供共享资源的简单接口。 分配器管理器是由 COM+ 提供的组件,用于协调各种资源分配器的活动。

资源分配器是至少提供两个接口的动态链接库 (DLL) 组件。 第一个 IDispenserDriver 为分配器管理器提供了有关如何创建、销毁和登记其管理的资源的基本信息。 第二个接口会公开给应用程序,可以是 COM 接口或接口集,也可以是组件通过导入库链接到的应用程序编程接口 (API)。 应用程序可以调用任何资源分配器,后者反过来可能会向应用程序提供任何 API。 如果资源分配器是自动化组件,可以从 Microsoft Visual Basic 访问它。 当应用程序组件引用资源分配器时,将实例化资源分配器。

COM+ 提供的分配器管理器跟踪和协调资源分配器。 它实现两个接口:IDispenserManagerIHolder。 资源分配器使用 IDispenserManager 接口自行注册。 然后,分配器管理器向它们提供一个指向 IHolder 的指针,用于通知分配器管理器其活动。

事务资源分配器必须在分布式事务处理协调器 (DTC) 事务中登记。 这意味着,使用符合 OLE 事务的(资源分配器)内部或外部的资源管理器。

注意

COM+ 编程模型包括声明性事务,有助于保护应用程序对象在其生存期内执行的工作。 当应用程序对象使用 COM+ 资源分配器时,它执行的工作将自动是事务工作;也就是说,组件不必显式声明事务。 这些事务在 OLE 事务规范中定义,由 DTC 实现,并由 COM+ 代表应用程序对象启动。 有关详细信息,请参阅《DTC 开发指南》。

 

资源不需要是事务资源。 共用非事务资源的资源分配器仍可以通过允许应用程序对象访问这些资源的共享池来实现高性能。 这种类型的资源分配器从 IDispenserDriver::EnlistResource 方法返回 S_FALSE,这意味着资源分配器没有登记资源,因为资源不是事务资源。

资源分配器也可以独立于 COM+ 运行,从而仅提供资源池功能。 例如,如果资源分配器公开 API(如 ODBC),资源分配器可能是应用程序通过导入库(或使用 LoadLibraryGetProcAddress 函数)访问的 DLL。 资源分配器也可能是应用程序通过调用 CoCreateInstance 访问的 COM 组件。 如果没有 COM+,则无法调用资源分配器的 EnlistResource 方法,因为分配器管理器不知道当前组件事务。

启动时,资源分配器 DLL 必须向分配器管理器注册自身。 分配器管理器是管理资源分配器的加载和卸载的控制主管,提供 COM+ 上下文,并控制库存统计信息管理器。 (有关详细信息,请参阅 COM+ 分配器管理器。资源分配器首先调用 GetDispenserManager 函数,然后调用 IDispenserManager::RegisterDispenser 方法,并传递资源分配器实现的 IDispenserDriver 指针。 此调用返回对 IHolder 的引用。

若要关闭,资源分配器会调用 IHolder::Close。 为了确保干净的包关闭,资源分配器必须能够处理在 COM+ 要求分配器关闭后,调用继续从业务对象到达的情况。

本主题中的以下主题提供有关 COM+ 资源分配器服务的更多详细信息:

COM+ 资源分配器任务