Поделиться через


Принцип работы пула объектов

При настройке компонента для пула COM+ будет поддерживать экземпляры этого компонента в пуле, которые готовы к активации для любого клиента, запрашивающего компонент. Все запросы на создание объектов будут обрабатываться с помощью диспетчера пула.

Пулы настраиваются и поддерживаются для каждого компонента. Пул состоит из однородных объектов, использующих один и тот же CLSID. Единственным исключением являются транзакционные объекты, для которых подпулы содержат объекты, имеющие привязку к транзакции, пока транзакция находится в ожидании.

При запуске приложения пул будет заполнен до минимального уровня, указанного администратором, до тех пор, пока будет выполнено успешное создание объекта. Запросы клиентов на компонент обрабатываются по принципу "первым пришел - первым обслужен" из общего ресурса. Если нет доступных объектов в пуле и пул еще не находится на указанном максимальном уровне, создается и активируется новый объект для клиента.

Когда пул достигает максимального уровня, запросы клиентов помещаются в очередь и получат первый доступный объект из пула. Число объектов, включая активированные и деактивированные, никогда не превысит максимальное значение пула. Запросы на создание объектов будут истекать по истечении административно контролируемого периода, чтобы управлять периодом ожидания создания объектов клиентами. После сбоя времени ожидания клиент возвращает ошибку E_TIMEOUT из CoCreateInstance.

По возможности COM+ попытается повторно использовать объект после его выпуска клиентом, пока пул не достигнет максимального уровня. Объект отвечает за мониторинг состояния, чтобы определить, может ли он использоваться повторно и должен возвращать соответствующее значение для IObjectControl::CanBePooled.

При создании объекта в пуле он агрегируется в более крупный объект, который будет управлять временем существования объекта. Внешний объект вызывает методы IObjectControl в соответствующее время в жизненном цикле объекта, как показано ниже.

  • Метод активации вызывается всякий раз, когда объект возвращается клиенту, и активируется в определенном контексте.
  • Метод деактивации вызывается всякий раз, когда объект освобождается клиентом или, в случае объекта, который активируется JIT, при его деактивации.
  • Метод CanBePooled вызывается всякий раз, когда объект должен возвращаться в общий пул. Если объект обнаруживает, что некоторый повторно используемый ресурс находится в плохом состоянии, он должен вернуть FALSE для этого метода, а диспетчер пулов отбрасывает объект.

Объект не обязательно должен реализовывать IObjectControl. Если это не так, экземпляры всегда будут повторно использоваться, пока не будет достигнут максимальный уровень пула.

Дополнительные сведения о том, как настраивать компоненты для использования в пуле, см. в разделе Настройка компонента для использования в пуле.

строки конструктора объектов COM+

управление временем существования объекта и состоянием

повышение производительности с помощью пула объектов

Объединение транзакционных объектов

требования для объектов, которые могут находиться в пуле