Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Pagetitle
Pool de Conexões com o DBAccess em AdvPL
Pool de Conexões com o DBAccess em AdvPL

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

...

Inclusão de trecho
DBAccess
DBAccess
nopaneltrue
em
Inclusão de trecho
AdvPL
AdvPL
nopaneltrue
, a seguir:

...

...

...

Conceito de Pool de Conexão

A implementação de Pool de

...

Conexão no 

Inclusão de trecho
advpl
advpl
nopaneltrue
parte da premissa do compartilhamento de conexões entre múltiplas threads sendo executadas na mesma instância de

...

Inclusão de trecho
application server
application server
nopaneltrue
, 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

...

Inclusão de trecho
application server
application server
nopaneltrue
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 
    Inclusão de trecho
    dbaccess
    dbaccess
    nopaneltrue
    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

...

Inclusão de trecho
Application Server
Application Server

...

nopaneltrue
.

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

Inclusão de trecho
AdvPL
AdvPL
nopaneltrue
que utiliza este recurso:

Bloco de código
languagecpp
firstline1
linenumberstrue
// Incio 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

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