[firebase-br] FireDac + Firebird: não libera cursor/memória, apos Close no FDQuery?

thiago.almeida em neainformatica.com.br thiago.almeida em neainformatica.com.br
Sex Fev 17 11:01:47 -03 2017


 

if qMovimentoMes.Active then
 qMovimentoMes.Close;

qMovimentoMes.SQL.clear;
 qMovimentoMes.SQL.Add(sMOVIMENTOMES);

qMovimentoMes.SQL.Add(Format('where id = %d',[_id])
 qMovimentoMes.Open;


Quando o debug passa pelo .Open, o consumo de memória sobe. Quando
passa pelo .Close, não diminui. 

O estouro de memória acontece ANTES de
fechar o form 

Embora haja perto de 5000 interações, o loop não está
infinito. 

Obrigado 

Francisco Thiago 

Em 17/02/2017 09:47, Carlos
Andrade escreveu: 

> Você poderia postar o trecho do código no momento
em que fecha e abre a 
> query e quando fecha o form? Já verificou se no
seu while nao está 
> fazendo loop infinito? Acrescentou junto aos
componentes do FireDac o 
> TFDGUIxWaitCursor? Está liberando da memória
seu form (alto como: 
> form.free;)?
> 
> Em 17/02/2017 08:24,
thiago.almeida em neainformatica.com.brescreveu:
> 
>> Sras e Srs, Bom dia.
Em uma aplicação nossa, percebi algo que achei curioso. Por uma
necessidade X, preciso fazer consultas ao banco dentro de um loob while
(estou falando do Delphi). Neste loop, eu fecho o FDQuery, configuro os
parâmetros e abro o FDQuery. Nos testes percebemos que esta query dentro
do While não está liberando a memória ocupada após o .Close (causando um
estouro de memória). A solução que encontrei foi desligar o RequestLive,
tornando o dataset somente leitura (como não faço atualizações através
dessa query, não houve problema algum). O caso é que eu fiquei sem
entender o que de fato aconteceu. Pode ser que eu esteja enganado, mas
até onde sei, quando se abre uma query, os dados são carregados e um
cache interno (daí vai de cada componente) é mantido para que o cursor
seja multi-direcional. Contudo eu esperava que com o .Close, toda
memória alocada fosse liberada junto com o cursor. O que podemos
identificar é que esse estouro acontece na máquina cliente apenas. No
servidor, fica tudo tranquilo. O que me leva a questionar o FireDac e
sua gerência de memória ou o FireDac e a falta de um comando para que o
client (fbclient.dll) libere a memória/cursor. Alguém já viu isso? []'s
Francisco Thiago.
> 
> ______________________________________________
>
FireBase-BR (www.firebase.com.br [1]) - Hospedado em www.locador.com.br
[2]
> Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107 [3]
> Para consultar
mensagens antigas: http://www.firebase.com.br/pesquisa_lista.html [4]




Links:
------
[1] http://www.firebase.com.br
[2]
http://www.locador.com.br
[3]
http://www.firebase.com.br/fb/artigo.php?id=1107
[4]
http://www.firebase.com.br/pesquisa_lista.html



Mais detalhes sobre a lista de discussão lista