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:
- http://tdn.totvs.com/display/tec/TCGetPool
- http://tdn.totvs.com/display/tec/TCSetPool
- http://tdn.totvs.com/display/tec/TCPoolInfo
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
- Quando um processo precisar de uma conexão, ele prioriza o uso das conexões ativas no Pool, somente criando uma nova caso o pool esteja vazio.
- Ao invés de matar a conexão após o uso, o processo devolve a conexão ao Pool.
- Se ninguém usar a conexão por 60 segundos, ela é encerrada automaticamente, deixando de consumir recursos do DBaccess e do SGDB
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" )