Требования к объектам с пулом
Объекты, доступные в пуле, должны соответствовать определенным требованиям, чтобы один экземпляр объекта использовался несколькими клиентами.
Служба без отслеживания
Чтобы обеспечить безопасность, согласованность и изоляцию, объекты, доступные для пула, не должны содержать состояния, относящиеся к клиенту, от клиента к клиенту. Вы можете управлять любым состоянием клиента с помощью IObjectControl, выполняя инициализацию с определенным контекстом с помощью IObjectControl::Активация и очистка любого состояния клиента с помощью IObjectControl::D eactivate. Дополнительные сведения см. в разделе "Управление временем существования объекта и состоянием".
Нет сходства потоков
Объекты, доступные в пуле, не могут быть привязаны к определенному потоку; в противном случае производительность может быть потенциально катастрофическим. По этой причине объекты, доступные для пула, нельзя пометить для запуска в модели квартиры; они должны работать в многопоточной квартире или нейтральной квартире. Кроме того, объекты, доступные в пуле, не должны использовать локальное хранилище потоков и не должны агрегировать маршалер свободного потока. Дополнительные сведения о потоке в COM+см. в разделе "Модели потоков COM+".
Примечание.
Microsoft Visual Basic 6.0 и более ранних сред разработки могут создавать только компоненты модели квартиры. Однако в Visual Basic .NET компоненты можно использовать в пуле.
Aggregatable
Объекты, доступные в пуле, должны поддерживать агрегирование, т. е. они должны поддерживать создание путем вызова CoCreateInstance с аргументом pUnkOuter, отличного от NULL. Когда COM+ активирует объект в пуле, он создает агрегат для управления временем существования объекта в пуле и вызова методов в IObjectControl. Дополнительные сведения о написании агрегируемых объектов см. в разделе "Агрегирование".
Компоненты транзакций
Объекты с пулом, участвующие в транзакциях, должны вручную заручиться управляемыми ресурсами. Если объект содержит управляемый ресурс, например подключение к базе данных, диспетчер ресурсов не будет автоматически входить в транзакцию при активации объекта в определенном контексте. Таким образом, сам объект должен обрабатывать логику обнаружения транзакции, отключения автоматического перечисления диспетчера ресурсов и ручного зачисления всех ресурсов, которые он содержит. Кроме того, объект с пулом транзакций должен отражать текущее состояние своих ресурсов в значениях параметров IObjectControl::CanBePooled. Дополнительные сведения см. в разделе "Пул транзакционных объектов".
Реализация IObjectControl для управления временем существования объекта
Объекты, доступные в пуле, должны реализовывать IObjectControl, хотя это не обязательно. Однако компоненты транзакций, объединенные в пул, должны реализовать IObjectControl. Эти компоненты должны отслеживать состояние удерживаемых ресурсов и указывать, когда их нельзя повторно использовать; Когда IObjectControl::CanBePooled возвращает значение false, это приведет к созданию транзакции. Дополнительные сведения см. в разделе "Управление временем существования объекта и состоянием".
Ограничения языка
Компоненты, разработанные с помощью Microsoft Visual Basic 6.0 и более ранних версий, нельзя использовать в пуле, так как эти компоненты будут потоковой моделью квартиры. Однако в Visual Basic .NET компоненты можно использовать в пуле.
Устаревшие компоненты
Если они не являются транзакциональными и соответствуют соответствующим требованиям, компоненты можно объединять в пул, даже если они не были написаны с учетом возможностей пула. Не обязательно реализовать IObjectControl; компонент, который не делает этого, просто не будет участвовать в управлении его временем существования. Если IObjectControl::CanBePooled не реализован, объект будет повторно использоваться до достижения максимального размера пула.
См. также