Пул транзакционных объектов
Компоненты транзакций, которые должны быть включены в пул, имеют особые требования.
Перечисление ресурсов вручную
Объекты с пулом, участвующие в транзакциях, должны вручную заручиться управляемыми ресурсами. Если объект содержит управляемые ресурсы между клиентами, диспетчер ресурсов не сможет автоматически заручиться транзакцией при активации объекта в заданном контексте.
Сам объект должен обрабатывать логику обнаружения транзакции, отключения автоматического перечисления диспетчера ресурсов и ручного перечисления всех ресурсов, которые он содержит. Действия по выполнению этого зависят от используемого диспетчера ресурсов. Если вам нужно выполнить ручное зачисление, обратитесь к документации по диспетчеру ресурсов.
Как описано ниже, объекты можно объединить с сопоставлением транзакций, пока транзакция активна и может быть активирована сходством транзакций при вызове клиента, связанного с этой транзакцией. Перед зачислением ресурсов необходимо сначала проверка для сопоставления транзакций. Если объект был взят из пула, относящееся к этой транзакции, он уже выполнил работу в этой транзакции и завернул свои ресурсы.
Отключение автоматического перечисления
Автоматическое зачисление должно быть отключено после получения ресурса, как правило, в конструкторе объекта. То есть вы отключите автоматическую зачисление, а затем подключитесь.
Отключение автоматического перечисления иногда может быть тонкой процедурой, особенно в случае с многоуровневыми поставщиками доступа к данным. Автоматическое перечисление иногда связано с пулом подключений, как и с ODBC, а иногда и не так, как с OLE DB. Возможно, потребуется убедиться, что автозапись отключена на нескольких уровнях поставщиков.
Реализация IObjectControl
Объекты с пулом, участвующие в транзакциях, должны отслеживать текущее состояние ресурсов, которые они хранят. Если объект обнаруживает, что он находится в состоянии, отличном от повторного использования, например, если соединение плохо, оно должно возвращать false для IObjectControl::CanBePooled. Это приведет к отсутствам карта экземпляру объекта и к тому, что она будет обречена на текущую транзакцию.
Пулы, относящиеся к транзакциям
Пул объектов, как правило, однородный, и любой объект в пуле, который в настоящее время не используется, хорошо вернуться к любому клиенту. Единственным исключением из этого правила является случай транзакционных объектов, для которых оптимизирован пул объектов. Когда клиент запрашивает связанную транзакцию, COM+ сканирует пул для доступного объекта, который уже связан с этой транзакцией. Если объект с сходством транзакций найден, он возвращается клиенту; в противном случае возвращается объект из общего пула.
Таким образом, специальные подпули поддерживаются, содержащие объекты с сходством для конкретной транзакции. Когда транзакция фиксирует или прерывает, эти объекты возвращаются в общий пул без сопоставления транзакций, готовые к использованию любым клиентом.
По этой причине, когда компонент вручную зачисливает управляемые ресурсы в транзакцию, сначала следует проверка, чтобы узнать, уже ли они включены. В этом случае нет необходимости входить в список.
См. также