Partilhar via


Pool de conexões do Gerenciador de Driver

A gestão de conexões permite que uma aplicação utilize uma ligação de um pool de conexões que não precisam de ser restabelecidas a cada utilização. Uma vez criada uma ligação e colocada num pool, uma aplicação pode reutilizar essa ligação sem realizar o processo completo de ligação.

A utilização de uma ligação em pool pode resultar em ganhos significativos de desempenho, porque as aplicações podem poupar a sobrecarga envolvida na criação de uma ligação. Isto pode ser particularmente significativo para aplicações de nível intermédio que se ligam através de uma rede ou para aplicações que se conectam e desconectam repetidamente, como aplicações de Internet.

Para além dos ganhos de desempenho, a arquitetura de pooling de ligações permite que um ambiente e as suas ligações associadas sejam utilizados por múltiplos componentes num único processo. Isto significa que componentes autónomos no mesmo processo podem interagir entre si sem estarem conscientes uns dos outros. Uma ligação num pool de ligações pode ser usada repetidamente por múltiplos componentes.

Observação

A criação de pools de conexão pode ser usada por uma aplicação ODBC que apresente comportamento de ODBC 2.x, desde que a aplicação possa chamar SQLSetEnvAttr. Ao usar pooling de ligações, a aplicação não deve executar instruções SQL que alterem a base de dados ou o contexto da base de dados, como alterar o nome <da >, o 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 com threads para suportar o pooling de conexões. Isto significa que o driver consegue gerir uma chamada em qualquer thread a qualquer momento e pode ligar-se a um thread, usar a ligação a outro thread e desligar num terceiro thread.

O pool de conexões é mantido pelo "Driver Manager". As ligações são extraídas do pool quando a aplicação chama SQLConnect ou SQLDriverConnect e são devolvidas ao pool quando a aplicação chama SQLDisconnect. O tamanho do pool cresce dinamicamente, com base nas alocações de recursos solicitadas. Encolhe-se com base no timeout da inatividade: Se uma ligação estiver inativa durante um período de tempo (não foi usada numa ligação), é removida do pool. O tamanho do pool é limitado apenas por restrições de memória e limitações no servidor.

O Gestor de Drivers determina se uma ligação específica num pool deve ser usada de acordo com os argumentos passados no SQLConnect ou SQLDriverConnect, e de acordo com os atributos de ligação definidos após a alocação da ligação.

Quando o Driver Manager está a gerir o agrupamento de ligações, precisa de conseguir determinar se uma ligação ainda está a funcionar antes de a fornecer. Caso contrário, o Gestor de Drivers continua a entregar a ligação morta à aplicação sempre que ocorre uma falha transitória na rede. Um novo atributo de ligação foi definido no ODBC 3*.x*: SQL_ATTR_CONNECTION_DEAD. Este é um atributo de ligação apenas de leitura que retorna SQL_CD_TRUE ou SQL_CD_FALSE. O valor SQL_CD_TRUE significa que a ligação foi perdida, enquanto o valor SQL_CD_FALSE significa que a ligação ainda está ativa. (Drivers que cumprem versões anteriores do ODBC também podem suportar este atributo.)

Um driver deve implementar esta opção de forma eficiente, caso contrário isso prejudicará o desempenho do pool de ligações. Especificamente, uma chamada para obter este atributo de ligação não deve causar uma viagem de ida e volta ao servidor. Em vez disso, o driver deve simplesmente devolver o último estado conhecido da conexão. A ligação está morta se a última viagem ao servidor falhou, e não está morta se a última viagem foi bem-sucedida.

Observações

Se uma ligação for perdida (reportada via SQL_ATTR_CONNECTION_DEAD), o ODBC Driver Manager destrói essa ligação chamando SQLDisconnect no driver. Novos pedidos de ligação podem não encontrar uma ligação utilizável no pool. Eventualmente, o Driver Manager pode criar uma nova ligação, assumindo que o pool está vazio.

Para usar um pool de ligações, uma aplicação executa os seguintes passos:

  1. Permite o pooling de ligações ao chamar SQLSetEnvAttr para definir o atributo de ambiente SQL_ATTR_CONNECTION_POOLING para SQL_CP_ONE_PER_DRIVER ou SQL_CP_ONE_PER_HENV. Esta chamada deve ser feita antes de a aplicação alocar o ambiente partilhado para o qual o pooling de conexões deve ser ativado. O handle do ambiente na chamada para SQLSetEnvAttr deve ser definido como null, o que torna SQL_ATTR_CONNECTION_POOLING um atributo ao nível do processo. Se o atributo estiver definido para SQL_CP_ONE_PER_DRIVER, é suportado um único pool de ligação para cada driver. Se uma aplicação funciona com muitos drivers e poucos ambientes, isto pode ser mais eficiente porque podem ser necessárias menos comparações. Se definido para SQL_CP_ONE_PER_HENV, é suportado um único pool de ligação para cada ambiente. Se uma aplicação funciona com muitos ambientes e poucos drivers, isto pode ser mais eficiente porque podem ser necessárias menos comparações. O agrupamento de ligações é desativado ao definir SQL_ATTR_CONNECTION_POOLING para SQL_CP_OFF.

  2. Aloca um ambiente chamando SQLAllocHandle com o argumento HandleType definido como SQL_HANDLE_ENV. O ambiente alocado por esta chamada será um ambiente partilhado implícito devido à ativação do pool de conexões. No entanto, o ambiente a ser utilizado não é determinado até que o SQLAllocHandle com um HandleType de SQL_HANDLE_DBC seja chamado neste ambiente.

  3. Aloca uma ligação chamando SQLAllocHandle com o InputHandle estabelecido como SQL_HANDLE_DBC, e o InputHandle estabelecido como o handle do ambiente alocado para pooling de ligações. O Gestor de Drivers tenta encontrar um ambiente existente que corresponda aos atributos do ambiente definidos pela aplicação. Se tal ambiente não existir, é criado um, com uma contagem de referências (mantida pelo Gestor de Drivers) de 1. Se for encontrado um ambiente partilhado correspondente, o ambiente é devolvido à aplicação e o seu número de referências é incrementado. (A ligação real a ser utilizada não é determinada pelo Gestor de Drivers até que o SQLConnect ou SQLDriverConnect seja chamado.)

  4. Chama SQLConnect ou SQLDriverConnect para fazer a ligação. O Gestor de Drivers utiliza as opções de ligação na chamada para SQLConnect (ou as palavras-chave de ligação na chamada para SQLDriverConnect) e os atributos de ligação definidos após a alocação de ligação para determinar qual a ligação do pool que deve ser usada.

    Observação

    A forma como uma ligação solicitada é emparelhada com uma ligação em pool é determinada pelo atributo SQL_ATTR_CP_MATCH ambiente. Para mais informações, consulte SQLSetEnvAttr.

    As aplicações ODBC que utilizam pool de conexões devem chamar CoInitializeEx durante a inicialização da aplicação e CoUninitialize quando a aplicação fecha.

  5. Chama SQLDisconnect quando termina a ligação. A ligação é devolvida ao pool de ligação e torna-se disponível para reutilização.

Para uma discussão aprofundada, consulte Pooling nos Componentes de Acesso a Dados da Microsoft.

Considerações sobre o pool de conexões

Realizar qualquer uma das seguintes ações usando um comando SQL (em vez de através da API ODBC) pode afetar o estado da ligação e causar problemas inesperados quando o pooling de ligação está ativo:

  • Abrir uma ligação e alterar a base de dados predefinida.

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

  • Criação de tabelas temporárias e procedimentos armazenados.

Se alguma destas ações for realizada fora da API ODBC, a próxima pessoa que usar a ligação herdará automaticamente as definições, tabelas ou procedimentos anteriores.

Observação

Não espere que certas definições estejam presentes no estado de ligação. Deve sempre definir o estado da ligação na sua aplicação e garantir que a aplicação remove quaisquer definições de pool de ligação não utilizadas.

Driver-Aware Pool de conexões

A partir do Windows 8, um driver ODBC pode usar as ligações do pool de forma mais eficiente. Para mais informações, consulte Driver-Aware Pooling de Ligações.

Ver também

Ligação a uma Fonte de Dados ou Driver
Desenvolvimento de um Driver ODBC
Pooling nos componentes de acesso a dados da Microsoft