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


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

Компоненты транзакций, которые должны быть включены в пул, имеют особые требования.

Ручное перечисление ресурсов

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

Сам объект должен справляться с задачей обнаружения транзакции, отключения автоматического присоединения диспетчера ресурсов и ручного присоединения всех ресурсов, которыми он владеет. Действия по выполнению этого зависят от используемого диспетчера ресурсов. Если вам нужно выполнить ручную регистрацию, обратитесь к документации по вашему диспетчеру ресурсов.

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

Отключение автоматического внесения в список

Автоматическое зачисление должно быть отключено после получения ресурса, как правило, в конструкторе объекта. То есть вы отключаете автоматическое включение, а затем подключаетесь.

Отключение автоматического перечисления иногда может быть тонкой процедурой, особенно в случае с многоуровневыми поставщиками доступа к данным. Автоматическое подключение иногда связано с пулом подключений, например, в случае с ODBC, а иногда не связано, как с OLE DB. Возможно, потребуется убедиться, что авто-присоединение отключено на различных уровнях провайдеров.

Реализация IObjectControl

Объекты, которые можно объединять в пул, участвующие в транзакциях, должны отслеживать текущее состояние ресурсов, которыми они управляют. Если объект обнаруживает, что он находится в состоянии, непригодном для повторного использования, например, если подключение плохое, он должен возвращать false для IObjectControl::CanBePooled. Это приведет к отказу экземпляра объекта и обречению текущей транзакции.

пулы Transaction-Specific

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

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

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

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

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

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

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

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