Introdução

Quando pensamos em desenvolvimento de aplicações tendo em foco o fator de escalabilidade, um dos pontos a serem considerados é a utilização de uma conexão com o Banco de Dados apenas quando necessário. Visando uma forma elegante e inteligente de compartilhamento de conexões em AdvPL, foram criadas algumas funções para gerenciamento de Pool de Conexões com o DBAccess em AdvPL, a seguir:

Conceito de Pool de Conexão

A implementação de Pool de conexão no AdvPL parte da premissa do compartilhamento de conexões entre múltiplas threads sendo executadas na mesma instância de TOTVS | Application Server, a partir de um identificador nomeado, onde cada aplicação deve buscar uma conexão livre no pool, usando a função TCGetPool(), devendo apenas criar uma nova conexão caso não seja recuperada nenhuma conexão. Uma vez usada a conexão, sendo ela obtida no pool ou não, todas as tabelas e queries desta conexão devem ser fechadas, e a conexão deve ser colocada em um pool nomeado por um identificador, através da função TCSetPool(). Desta forma, o TOTVS Application Server sobe apenas uma thread de controle do Poo, responsável apenas por encerrar / fechar as conexões que não foram utilizadas pelos últimos 60 segundos. 

Vantagens

Exemplo de Implementação

Inicialmente, precisamos lembrar que uma conexão ativa, para ser colocada no Pool de Conexões, não deve ter nenhuma tabela ou Query aberta. Uma vez atendido a este requisito, devemos criar um identificador nomeado para o Pool, que não conflite com outros ambientes ou conexões que podem ser feitas de outros ambientes vindos da mesma instância do TOTVS Application Server. Por exemplo, podemos usar como identificador o tipo do banco mais o nome do DSN da conexão. Por exemplo, uma conexão feita para o MSSQL, com o DSN ENVP12, pode fazer parte do pool "MSSQL_ENVP12". 

// Incio da Rotina
nHnd := TCGetPool("MSSQL_ENVP12") // tenta recuperar conexao do Pool
IF nHnd < 0  // Nao tme conexoes, cria uma nova
   nHnd := TCLink()
   If nHnd < 0 
      UserException("TCLink Failed - Error "+cValToChar(nHnd))
   Endif
Endif
TCSetConn(nHnd)
/* ----- ----- ----- ----- ----- ----- 
Corpo da Rotina – Usa a conexão 
----- ----- ----- ----- ----- ----- */
// Final da rotina -- Garante que a conexão ativa é a que deve ser enviada ao Pool
TCSetConn(nHnd)
// Envia a conexão para o POOL , desamarrando ela do processo atual 
TCSetPool( "MSSQL_ENVP12" )