Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

Versão 1 Próxima »

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

  • 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" )





  • Sem rótulos