Histórico da Página
Pagetitle | ||||
---|---|---|---|---|
|
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
Inclusão de trecho | ||||||
---|---|---|---|---|---|---|
|
Inclusão de trecho | ||||||
---|---|---|---|---|---|---|
|
...
...
...
Conceito de Pool de Conexão
A implementação de Pool de
...
Conexão no
Inclusão de trecho | ||||||
---|---|---|---|---|---|---|
|
...
Inclusão de trecho | ||||||
---|---|---|---|---|---|---|
|
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 | ||||||
---|---|---|---|---|---|---|
|
...
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
e do SGDB.Inclusão de trecho dbaccess dbaccess nopanel true
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 | ||||
---|---|---|---|---|
|
...
|
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 | ||||||
---|---|---|---|---|---|---|
|
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
// 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" ) |