Partilhar via


Pool de conexões do Gerenciador de Driver

O pool de conexões permite que um aplicativo use uma conexão de um pool de conexões que não precisam ser restabelecidas para cada uso. Depois que uma conexão é criada e colocada em um pool, um aplicativo pode reutilizar essa conexão sem executar o processo de conexão completo.

O uso de uma conexão em pool pode resultar em ganhos significativos de desempenho, pois os aplicativos podem economizar a sobrecarga envolvida na criação de uma conexão. Isso pode ser particularmente significativo para aplicativos de camada intermediária que se conectam por uma rede ou para aplicativos que se conectam e desconectam repetidamente, como aplicativos da Internet.

Além dos ganhos de desempenho, a arquitetura de pool de conexões permite que um ambiente e suas conexões associadas sejam usados por vários componentes em um único processo. Isso significa que componentes independentes no mesmo processo podem interagir uns com os outros sem estarem cientes uns dos outros. Uma conexão em um pool de conexões pode ser usada repetidamente por vários componentes.

Observação

O pool de conexões pode ser usado por um aplicativo ODBC exibindo comportamento ODBC 2.x, desde que o aplicativo possa chamar SQLSetEnvAttr. Ao usar o pool de conexões, o aplicativo não deve executar instruções SQL que alteram o banco de dados ou o contexto do banco de dados, como alterar o <nome do banco de dados>, que altera o catálogo usado por uma fonte de dados.

Um driver ODBC deve ser totalmente thread-safe e as conexões não devem ter afinidade de thread para oferecer suporte ao pool de conexões. Isso significa que o driver pode lidar com uma chamada em qualquer thread a qualquer momento e pode se conectar em um thread, usar a conexão em outro thread e desconectar em um terceiro thread.

O pool de conexões é mantido pelo Gerenciador de Driver. As conexões são extraídas do pool quando o aplicativo chama SQLConnect ou SQLDriverConnect e são retornadas ao pool quando o aplicativo chama SQLDisconnect. O tamanho do pool cresce dinamicamente, com base nas alocações de recursos solicitadas. Ele reduz com base no tempo limite de inatividade: se uma conexão estiver inativa por um período de tempo (ela não foi usada em uma conexão), ela será removida do pool. O tamanho do pool é limitado apenas por restrições de memória e limites no servidor.

O Gerenciador de Driver determina se uma conexão específica em um pool deve ser usada de acordo com os argumentos passados em SQLConnect ou SQLDriverConnect e de acordo com os atributos de conexão definidos após a conexão ter sido atribuída.

Quando o Gerenciador de Driver está agrupando conexões, ele precisa ser capaz de determinar se uma conexão ainda está funcionando antes de distribuir a conexão. Caso contrário, o Gerenciador de Driver continuará distribuindo a conexão inativa para o aplicativo sempre que ocorrer uma falha de rede transitória. Um novo atributo de conexão foi definido no ODBC 3*.x*: SQL_ATTR_CONNECTION_DEAD. Esse é um atributo de conexão somente leitura que retorna SQL_CD_TRUE ou SQL_CD_FALSE. O valor SQL_CD_TRUE significa que a conexão foi perdida, enquanto o valor SQL_CD_FALSE significa que a conexão ainda está ativa. (Os drivers em conformidade com versões anteriores do ODBC também podem oferecer suporte a esse atributo.)

Um driver deve implementar essa opção de forma eficiente ou isso prejudicará o desempenho do pool de conexões. Especificamente, uma chamada para obter esse atributo de conexão não deve causar uma viagem de ida e volta ao servidor. Em vez disso, um driver deve apenas retornar o último estado conhecido da conexão. A conexão está inativa se a última viagem ao servidor falhou e ativa se a última viagem foi bem-sucedida.

Comentários

Se uma conexão tiver sido perdida (relatada via SQL_ATTR_CONNECTION_DEAD), o Gerenciador de Driver ODBC destruirá essa conexão chamando SQLDisconnect no driver. Novas solicitações de conexão podem não encontrar uma conexão utilizável no pool. Eventualmente, o Gerenciador de Driver pode fazer uma nova conexão, supondo que o pool esteja vazio.

Para usar um pool de conexões, um aplicativo executa as seguintes etapas:

  1. Habilita o pool de conexões chamando SQLSetEnvAttr para definir o atributo de ambiente SQL_ATTR_CONNECTION_POOLING como SQL_CP_ONE_PER_DRIVER ou SQL_CP_ONE_PER_HENV. Essa chamada deve ser feita antes que o aplicativo atribua o ambiente compartilhado para o qual o pool de conexões deve ser habilitado. O identificador de ambiente na chamada para SQLSetEnvAttr deve ser definido como nulo, o que torna SQL_ATTR_CONNECTION_POOLING um atributo de nível de processo. Se o atributo estiver definido como SQL_CP_ONE_PER_DRIVER, um único pool de conexões terá suporte para cada driver. Se um aplicativo funciona com muitos drivers e poucos ambientes, isso pode ser mais eficiente porque menos comparações podem ser necessárias. Se definido como SQL_CP_ONE_PER_HENV, um único pool de conexões terá suporte para cada ambiente. Se um aplicativo funciona com muitos ambientes e poucos drivers, isso pode ser mais eficiente porque menos comparações podem ser necessárias. O pool de conexões é desabilitado definindo SQL_ATTR_CONNECTION_POOLING como SQL_CP_OFF.

  2. Atribui um ambiente chamando SQLAllocHandle com o argumento HandleType definido como SQL_HANDLE_ENV. O ambiente atribuído por essa chamada será um ambiente compartilhado implícito porque o pool de conexões foi habilitado. O ambiente a ser usado não é determinado, no entanto, até que SQLAllocHandle com um HandleType de SQL_HANDLE_DBC seja chamado nesse ambiente.

  3. Atribui uma conexão chamando SQLAllocHandle com InputHandle definido como SQL_HANDLE_DBC e o InputHandle definido para o identificador de ambiente atribuído para pool de conexões. O Gerenciador de Driver tenta localizar um ambiente existente que corresponda aos atributos de ambiente definidos pelo aplicativo. Se esse ambiente não existir, um é criado, com uma contagem de referência (mantida pelo Gerenciador de Driver) de 1. Se um ambiente compartilhado correspondente for encontrado, o ambiente será retornado para o aplicativo e sua contagem de referência será incrementada. (A conexão real a ser usada não é determinada pelo Gerenciador de Driver até que SQLConnect ou SQLDriverConnect seja chamado.)

  4. Chama SQLConnect ou SQLDriverConnect para fazer a conexão. O Gerenciador de Driver usa as opções de conexão na chamada para SQLConnect (ou as palavras-chave de conexão na chamada para SQLDriverConnect) e os atributos de conexão definidos após a alocação de conexão para determinar qual conexão no pool deve ser usada.

    Observação

    A forma como uma conexão solicitada é correspondida a uma conexão em pool é determinada pelo atributo de ambiente SQL_ATTR_CP_MATCH. Para obter mais informações, confira SQLSetEnvAttr.

    Os aplicativos ODBC que usam o pool de conexões devem chamar CoInitializeEx durante a inicialização do aplicativo e CoUninitialize quando o aplicativo for fechado.

  5. Chama SQLDisconnect quando termina a conexão. A conexão é retornada ao pool de conexões e fica disponível para reutilização.

Para obter uma discussão detalhada, confira Pool no Microsoft Data Access Components.

Considerações sobre pool de conexões

A execução de qualquer uma das seguintes ações usando um comando SQL (em vez de por meio da API ODBC) pode afetar o estado da conexão e causar problemas inesperados quando o pool de conexões está ativo:

  • Abrir uma conexão e alterar o banco de dados padrão.

  • Usar a instrução SET para alterar quaisquer opções configuráveis (incluindo SET ROWCOUNT, ANSI_NULL, IMPLICIT_TRANSACTIONS, SHOWPLAN, STATISTICS, TEXTSIZE e DATEFORMAT).

  • Criar tabelas temporárias e procedimentos armazenados.

Se qualquer uma dessas ações for executada fora da API ODBC, a próxima pessoa que usar a conexão herdará automaticamente as configurações, tabelas ou procedimentos anteriores.

Observação

Não espere que determinadas configurações estejam presentes no estado da conexão. Você deve sempre definir o estado da conexão em seu aplicativo e garantir que o aplicativo remova todas as configurações de pool de conexões não utilizadas.

Pool de conexões com reconhecimento de driver

A partir do Windows 8, um driver ODBC pode usar conexões no pool com mais eficiência. Para obter mais informações, confira Pool de conexões com reconhecimento de driver.

Confira também

Conectando-se a uma fonte de dados ou a um driver
Desenvolvendo um driver ODBC
Pool no Microsoft Data Access Components