Árvore de páginas

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 TOTVS | 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 do 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 Pool, 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 TOTVS | 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 que este requisito seja atendido, devemos criar um identificador nomeado para o Pool, que não conflite com outros ambientes ou conexões que podem ser realizadas de outros ambientes vindos da mesma instância do TOTVS | Application Server.

Podemos então adotar como modelo de 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". 

A seguir, um exemplo de rotina AdvPL que utiliza este recurso:

// Início da Rotina
nHnd := TCGetPool("MSSQL_ENVP12") // tenta recuperar conexão do Pool
IF nHnd < 0  // Não tem conexões, 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-a do processo atual 
TCSetPool( "MSSQL_ENVP12" )
  • Sem rótulos