Основные понятия диспенсера ресурсов COM+

Компоненты приложений используют средство диспенсера ресурсов COM+ для доступа к общим, неуправляемым сведениям о состоянии, таким как подключения между компонентами и заданным диспетчером ресурсов. Во время выполнения динамические пулы ресурсов, такие как подключения к базе данных, сетевые подключения, подключения к очередям, потокам, объектам и блокам памяти, становятся доступными для диспенсера ресурсов. Процесс приложения обеспечивает высокую производительность с помощью минимального количества часто используемых ресурсов. Диспенсер ресурсов также может автоматизировать транзакции и повторное объявление. (См. раздел Автоматическое восстановление ресурсов для получения дополнительных сведений об этой функции.)

Примечание.

Ресурс — это все, что создает диспенсер ресурсов. Например, подключение к диспетчеру ресурсов является общим ресурсом. Ресурсы находятся в памяти диспенсера ресурсов и никогда не копируются в диспетчер диспенсеров. Ресурс известен только непрозрачным дескриптором (RESID) и может или не может выполнять транзакции. Хотя управляемые ресурсы часто могут быть подключениями к компоненту, управляя устойчивым состоянием, сами подключения не являются устойчивыми. Диспенсер ресурсов часто использует связанный диспетчер ресурсов для сохранения устойчивого состояния.

 

Архитектура, система диспенсера ресурсов COM+ состоит из диспенсеров ресурсов и диспетчера диспенсеров. Диспенсеры ресурсов — это компоненты, предоставляемые пользователем, которые предоставляют приложения с простыми интерфейсами для общих ресурсов. Диспетчер диспенсеров — это компонент, предоставляемый COM+, который координирует действия различных диспенсеров ресурсов.

Диспенсер ресурсов — это компонент библиотеки динамической компоновки (DLL), предоставляющий по крайней мере два интерфейса. Первый, IDispenserDriver, предоставляет диспетчер диспенсера с базовой информацией о создании, уничтожении и перечислении ресурсов, которыми он управляет. Второй предоставляется приложениям и может быть COM-интерфейсом или набором интерфейсов или может быть интерфейсом программирования приложения (API), к которому связан компонент через библиотеку импорта. Приложение может вызывать любой диспенсер ресурсов, который, в свою очередь, может предложить любой API приложению. Если диспенсер ресурсов является компонентом автоматизации, его можно получить из Microsoft Visual Basic. Экземпляр диспенсера ресурсов создается, когда компонент приложения ссылается на него.

Диспетчер диспенсеров, предоставляемый COM+ отслеживает диспенсеры ресурсов и координаты среди них. Он реализует два интерфейса: IDispenserManager и IHolder. Диспенсеры ресурсов регистрируются с помощью интерфейса IDispenserManager . Затем менеджер диспенсера дает им указатель на IHolder , который они используют для уведомления менеджера диспенсера о своей деятельности.

Диспенсер транзакционных ресурсов должен быть зачислен в транзакцию координатора распределенных транзакций (DTC). Это подразумевает использование внутреннего или внешнего диспетчера ресурсов (для диспенсера ресурсов), соответствующего транзакциям OLE.

Примечание.

Модель программирования COM+ включает декларативные транзакции, которые помогают защитить работу, выполняемую объектом приложения во время его существования. Когда объект приложения использует диспенсер ресурсов COM+, работа, выполняемая ею, автоматически выполняется транзакция; То есть компоненту не нужно явно объявлять транзакции. Эти транзакции определяются в спецификации OLE Transactions, реализованной DTC, и инициируются от имени объекта приложения COM+. Дополнительные сведения см. в руководстве по разработке DTC.

 

Ресурсы не должны быть транзакциальными. Диспенсер ресурсов, который пулы не транзакционных ресурсов по-прежнему могут обеспечить высокую производительность, позволяя объектам приложений получить доступ к общему пулу этих ресурсов. Этот тип диспенсера ресурсов возвращает S_FALSE из метода IDispenserDriver::EnlistResource , что означает, что диспенсер ресурсов не заверял ресурс, так как ресурс не является транзакционной.

Диспенсер ресурсов также может функционировать независимо от COM+, предоставляя только возможности пула ресурсов. Например, если средство диспенсера ресурсов предоставляет API (например, ODBC), то диспенсер ресурсов может быть библиотекой DLL, доступ к которому осуществляется приложением через библиотеку импорта (или с помощью функций LoadLibrary и GetProcAddress). Диспенсер ресурсов также может быть com-компонентом, к которому обращается приложение, вызывая CoCreateInstance. Без COM+метод диспенсера ресурсов EnlistResource никогда не может вызываться, так как диспетчер диспенсера не имеет знаний о текущей транзакции компонента.

При запуске библиотека DLL-библиотека диспенсера ресурсов должна зарегистрировать себя в диспетчере диспенсеров. Диспетчер диспенсеров — это руководитель, который управляет загрузкой и выгрузки диспенсеров ресурсов, предоставляет контекст COM+ и управляет диспетчером статистики инвентаризации. (Дополнительные сведения см. в разделе COM+ Dispenser Manager.) Средство диспенсера ресурсов сначала вызывает функцию GetDispenserManager, а затем вызывает метод IDispenserManager::RegisterDispenserDriver, передав указатель IDispenserDriver, который реализует диспенсер ресурсов. Этот вызов возвращает ссылку на IHolder.

Чтобы завершить работу, средство диспенсера ресурсов вызывает IHolder::Close. Чтобы обеспечить чистое завершение работы пакета, диспенсер ресурсов должен иметь возможность справиться с ситуацией, когда вызовы продолжают поступать из бизнес-объектов после ТОГО, как COM+ попросил диспенсер завершить работу.

В следующих разделах этого раздела содержатся более подробные сведения о службе диспенсера ресурсов COM+:

Задачи диспенсера ресурсов COM+