Como funciona o pool de objetos

Quando você configura um componente para ser agrupado, o COM+ manterá instâncias dele em um pool, prontas para serem ativadas para qualquer cliente que solicite o componente. Todas as solicitações de criação de objeto serão tratadas por meio do gerenciador de pool.

Os pools são configurados e mantidos por componente. Um pool consiste em objetos homogêneos que compartilham o mesmo CLSID. A única exceção é para objetos transacionais, para os quais subpools são mantidos contendo objetos que têm afinidade de transação enquanto uma transação está pendente.

Quando o aplicativo for iniciado, o pool será preenchido até o nível mínimo especificado administrativamente, desde que a criação do objeto seja bem-sucedida. À medida que as solicitações do cliente para o componente chegam, eles são satisfeitos por ordem de chegada do pool. Se nenhum objeto em pool estiver disponível e o pool ainda não estiver em seu nível máximo especificado, um novo objeto será criado e ativado para o cliente.

Quando o pool atinge seu nível máximo, as solicitações do cliente são enfileiradas e receberão o primeiro objeto disponível do pool. O número de objetos, incluindo ativados e desativados, nunca excederá o valor máximo do pool. As solicitações de criação de objeto expirarão após um período especificado administrativamente para que você possa controlar quanto tempo os clientes aguardarão pela criação do objeto. Em caso de falha no tempo limite, o cliente receberá de volta o E_TIMEOUT de erro de CoCreateInstance.

Sempre que possível, o COM+ tentará reutilizar um objeto depois que um cliente liberá-lo, até que o pool atinja seu nível máximo. O objeto é responsável por monitorar seu estado para determinar se ele pode ser reutilizado e deve retornar um valor apropriado para IObjectControl::CanBePooled.

Quando um objeto em pool é criado, ele é agregado em um objeto maior que gerenciará o tempo de vida do objeto. O objeto externo chama métodos em IObjectControl em momentos apropriados no ciclo de vida do objeto, da seguinte maneira:

  • O método Activate é chamado sempre que o objeto é retornado a um cliente, ativado em um contexto específico.
  • O método Deactivate é chamado sempre que um objeto é liberado pelo cliente ou, no caso de um objeto ativado por JIT, quando ele é desativado.
  • O método CanBePooled é chamado sempre que um objeto deve ser retornado ao pool geral. Se o objeto detectar que algum recurso reutilizável está em um estado incorreto, ele deverá retornar FALSE para esse método e o gerenciador de pool descartará o objeto.

Um objeto não precisa necessariamente implementar IObjectControl. Caso contrário, as instâncias sempre serão reutilizadas, até que o nível máximo do pool seja atingido.

Para obter detalhes sobre como configurar componentes a serem agrupados, consulte Configurando um componente a ser agrupado.

COM+ Object Construtor Strings

Controlando o tempo de vida e o estado do objeto

Melhorando o desempenho com o pool de objetos

Agrupando objetos transacionais

Requisitos para objetos agrupáveis