Conceitos de Dispensador de Recursos COM+

Os componentes do aplicativo usam o dispensador de recursos COM+ para acessar e gerenciar informações de estado compartilhadas e não duráveis, como conexões entre componentes e um determinado gerenciador de recursos. No tempo de execução, pools dinâmicos de recursos, como conexões de banco de dados, conexões de rede, conexões com filas, threads, objetos e blocos de memória, são disponibilizados para o dispensador de recursos. O processo de aplicação alcança alto desempenho usando um número mínimo de recursos usados com frequência. O dispensador de recursos também pode automatizar transações e recuperação. (Veja Recuperação Automática de Recursos para obter mais informações sobre esse recurso.)

Observação

Um recurso é qualquer coisa que um dispensador de recursos cria. Por exemplo, uma conexão com um gerenciador de recursos é um recurso comum. Os recursos residem na memória do dispensador de recursos e nunca são copiados para o gerenciador do dispensador. Um recurso é conhecido apenas por um identificador opaco (RESID) e pode ou não ser capaz de executar transações. Embora os recursos gerenciados geralmente sejam conexões com um componente que gerencia um estado durável, as conexões em si não são duráveis. Um dispensador de recursos geralmente usa um gerenciador de recursos relacionado para reter o estado durável.

 

Arquitetonicamente, o sistema de dispensador de recursos COM+ consiste em dispensadores de recursos e um gerenciador de dispensadores. Os dispensadores de recursos são componentes fornecidos pelo usuário que fornecem aos aplicativos interfaces simples para recursos compartilhados. O gerenciador de dispensadores é um componente fornecido pelo COM+ que coordena as atividades dos vários dispensadores de recursos.

Um dispensador de recursos é um componente de biblioteca de vínculo dinâmico (DLL) que fornece pelo menos duas interfaces. O primeiro, IDispenserDriver, fornece ao gerente de dispensadores informações básicas sobre como criar, destruir e recrutar os recursos que ele gerencia. O segundo é exposto aos aplicativos e pode ser uma interface COM ou conjunto de interfaces ou pode ser uma interface de programação de aplicativos (API) à qual um componente é vinculado por meio de uma biblioteca de importação. Um aplicativo pode chamar qualquer dispensador de recursos, que, por sua vez, pode oferecer qualquer API para o aplicativo. Se o dispensador de recursos for um componente de automação, ele poderá ser acessado no Microsoft Visual Basic. Um dispensador de recursos é instanciado quando um componente de aplicativo se refere a ele.

O gerenciador de dispensadores fornecido pelo COM+ rastreia os dispensadores de recursos e coordena entre eles. Ele implementa duas interfaces: IDispenserManager e IHolder. os dispensadores de recursos se registram usando a interface IDispenserManager . O gerente do dispensador então dá a eles um ponteiro para um IHolder que eles usam para notificar o gerente do dispensador de suas atividades.

Um dispensador de recursos transacionais deve se inscrever em uma transação DTC (Coordenador de Transações Distribuídas). Isso implica o uso de um gerenciador de recursos interno ou externo (para o dispensador de recursos) compatível com transações OLE.

Observação

O modelo de programação COM+ inclui transações declarativas, que ajudam a proteger o trabalho executado por um objeto de aplicativo durante sua vida útil. Quando um objeto de aplicativo usa um dispensador de recursos COM+, o trabalho que ele executa é automaticamente transacional; ou seja, o componente não precisa declarar transações explicitamente. Essas transações são definidas na especificação Transações OLE, implementadas pelo DTC e iniciadas em nome do objeto de aplicativo por COM+. Consulte o Guia de Desenvolvimento do DTC para obter mais informações.

 

Os recursos não precisam ser transacionais. Um dispensador de recursos que agrupa recursos não transacionais ainda pode alcançar alto desempenho permitindo que objetos de aplicativo acessem um pool compartilhado desses recursos. Esse tipo de dispensador de recursos retorna S_FALSE do método IDispenserDriver::EnlistResource, o que significa que o dispensador de recursos não inscreveu o recurso porque o recurso não é transacional.

O dispensador de recursos também pode funcionar independentemente do COM+, fornecendo apenas recursos de pool de recursos. Por exemplo, se um dispensador de recursos expõe uma API (como ODBC), o dispensador de recursos pode ser uma DLL acessada pelo aplicativo por meio de uma biblioteca de importação (ou usando as funções LoadLibrary e GetProcAddress). Um dispensador de recursos também pode ser um componente COM que um aplicativo acessa chamando CoCreateInstance. Sem COM+, o método EnlistResource de um dispensador de recursos nunca pode ser chamado porque o gerente do dispensador não tem conhecimento da transação de componente atual.

Na inicialização, uma DLL do dispensador de recursos deve se registrar no gerenciador do dispensador. O gerente de dispensadores é o executivo de controle que gerencia a carga e descarga de dispensadores de recursos, fornece o contexto COM+ e controla o gerente de estatísticas de estoque. (Para obter mais informações, consulte Gerente de Dispensadores COM+.) O dispensador de recursos primeiro chama a função GetDispenserManager e, em seguida, chama o método IDispenserManager::RegisterDispenser, passando o ponteiro IDispenserDriver que o dispensador de recursos implementa. Essa chamada retorna uma referência a IHolder.

Para desligar, um dispensador de recursos chama IHolder::Close. Para garantir um desligamento de pacote limpo, um dispensador de recursos deve ser capaz de lidar com a situação quando as chamadas continuam a chegar de objetos de negócios depois que o COM+ solicita que o dispensador desligue.

Os tópicos a seguir nesta seção fornecem informações mais detalhadas sobre o serviço de dispensador de recursos COM+:

Tarefas do dispensador de recursos COM+