Descrição:
Classe com métodos estáticos que faz a execução de uma query no DBAccess utilizando do cache de queries.
O cache é mantido na DBAPI e consome uma quantidade de memória proporcional ao retorno da query.
Caso EXATAMENTE a mesma query seja executada, o retorno será diretamente do cache da DBAPI, tendo assim uma performance muito superior a uma nova consulta no banco de dados.
Classe disponível a partir da lib label 20200908. Para saber o label de uma lib via advpl : FwLibVersion.
Para uso desta funcionalidade também é necessário a atualização do dbaccess e dbapi.dll para a versão 20.1.1.3 (sem a atualização da dbapi.dll e do dbaccess não é gerado qualquer erro, mas ao usar a classe o cache não é realizado).
Métodos:
OpenQuery
Descrição:
Executa uma query no banco de dados e faz o cache da mesma
Sintaxe:
FwExecCachedQuery():OpenQuery( <cQuery> , <cAlias>, <aSetField> , <cDriver> , <cLifeTime> , <cTimeOut> )
Parâmetros
Nome | Tipo | Descrição | Obrigatório | Referência |
---|
cQuery | Caractere | Query a ser executada | X |
|
cAlias | Caractere | Alias no qual a query será aberta |
| X |
aSetField | Array | Array com os campos para execução de TCSetField com a estrutura |
|
|
cDriver | Caractere | Driver de abertura da tabela |
|
|
cLifeTime | Caractere | Define se a query vai ficar no cache do DBAccess e qual o tempo de vida dela em segundos | X |
|
cTimeOut | Caractere | Define se a query vai ficar no cache do DBAccess e qual o timeout dela em segundos | X |
|
Retorno:
cAlias → Alias no qual a query foi aberta
ExecScalar
Descrição:
Executa uma query no banco de dados, fazendo cache da mesma e retornando apenas a primeira coluna da primeira linha
Sintaxe:
FwExecCachedQuery():ExecScalar( <cQuery> , <cColumn> , <cLifeTime> , <cTimeOut> )
Parâmetros
Nome | Tipo | Descrição | Obrigatório | Referência |
---|
cQuery | Caractere | Query a ser executada | X |
|
cColumn | Caractere | Nome da coluna a ser retornada | X |
|
cLifeTime | Caractere | Define se a query vai ficar no cache do DBAccess e qual o tempo de vida dela em segundos | X |
|
cTimeOut | Caractere | Define se a query vai ficar no cache do DBAccess e qual o timeout dela em segundos | X |
|
Exemplo de utilização:
#include "protheus.ch"
#define C_GRUPO "99"
#define C_FILIAL "01"
//-------------------------------------------------------------------
/*{Protheus.doc} QryCached
Exemplo de utilização da classe FwExecCachedQuery, classe responsável
por abrir queries já efetuando cache de seu retorno
@author Daniel Mendes
@since 28/08/2020
@version 1.0
*/
//-------------------------------------------------------------------
user function QryCached()
local cAlias as char
local cQuery as char
RpcSetEnv(C_GRUPO, C_FILIAL)
cQuery := "SELECT ED_CODIGO FROM " + RetSqlName("SED") + " WHERE D_E_L_E_T_ = ' '"
cAlias := FwExecCachedQuery():OpenQuery(cQuery,/*cAlias*/, /*aSetField*/, /*cDriver*/, "120", "60")
while !(cAlias)->(Eof())
ConOut((cAlias)->ED_CODIGO)
(cAlias)->(DBSkip())
enddo
(cAlias)->(DBCloseArea())
cQuery := "SELECT ED_DESCRIC FROM " + RetSqlName("SED") + " WHERE D_E_L_E_T_ = ' ' AND ED_CODIGO = 'XISTO'"
ConOut("ED_DESCRIC = " + FwExecCachedQuery():ExecScalar(cQuery, "ED_DESCRIC", "120", "60"))
RpcClearEnv()
return