[firebase-br] RES: RES: Consumo de memória muito Alto (Não libera)

Sandro Souza escovadordebits em gmail.com
Sex Dez 6 11:19:16 -03 2013


Meu nobre amigo.
O problema reside dentro do antigo Midas, atual Datasnap.
Existe um bug milenar dentro da DLL que é o coração do Datasnap, e
infelizmente, é o núcleo do TCustomClientDataSet, e portanto, afeta todas
as classes descendentes, e portanto, o dbExpress quase todo.
O bug causa vazamento de memória, ou seja, à medida que você vai usando
qualquer classe descendente de TCustomClientDataSet, mais memória alocada e
perdida vai sendo produzida.
Isso independe de ser uma aplicação multicamada ou cliente/servidor comum.
Faça um pequeno teste:

1 — Crie um projeto apenas com um único form.

2 — Coloque um componente derivado de TCustomClientDataSet.

3 — Configure-o para ler todos os registros de alguma tabela que tenha
muitos registros, a ponto de você notar o consumo de memória quando abrir o
ClientDataSet. Mas deixe o ClientDataSet fechado. (No meu teste, eu inseri
tantos dados na tabela de teste que aumentou o consumo de memória da
aplicação em cerca de 10 Mb quando eu abri o ClientDataSet)

4— Coloque um botão para abrir o ClientDataSet se ele estiver fechado e
fechá-lo se ele estiver aberto.

5 — Compile o projeto e o execute-o.

6 — Execute o gerenciador de tarefas para acompanhar o consumo de memória
dessa aplicação.

7 — Veja o consumo de memória da aplicação.

8 — Clique no botão para abrir o ClientDataSet.

9 — Veja novamente o consumo de memória da aplicação e anote o quanto
cresceu.

10 — Clique no botão para fechar o ClientDataSet.

11 — Veja novamente o consumo de memória da aplicação e verifique se voltou
ao consumo anterior.

12 — Volte ao passo 7 e repita o processo quantas vezes desejar até
comprovar se esse bug milenar ainda existe na sua versão de Delphi/BDS.

Desde o nascimento do Midas, no Delphi 5, que existe esse bug.

Não sofro mais esse problema porque eu estou usando um framework próprio
que fiz para desenvolver aplicações para web.
Em 06/12/2013 06:58, "Wesley Oliveira" <wesley em rgsystem.com.br> escreveu:

> As consultas feitas pelo nosso servidor usa um TSQLQuery com
> DataSetProvider
> pra retornar pro cliente os registros.
>
> O componente de conexão é um TDBExpress que herda de TSQLConnection e só
> tem
> algumas coisinhas a mais que não faz diferença pra isso não.
>
> Antes de iniciar a consulta, eu dou um StartTransaction e no final um
> Conexao.Commit.
> O DataSetProvider e a TSQLQuery são destruídos com FreeAndNil.
>
> Att.
>
> Wesley Oliveira
> Programador de Sistemas de Informação
> RG System Informática
> Fone:     +55 (27) 3727-1127
> Celular:  +55 (27) 99606-0038
>
>
> -----Mensagem original-----
> De: lista [mailto:lista-bounces em firebase.com.br] Em nome de Frederico
> Godoi
> Enviada em: quinta-feira, 5 de dezembro de 2013 17:13
> Para: FireBase
> Assunto: Re: [firebase-br] RES: Consumo de memória muito Alto (Não libera)
>
> Como você fez pra liberar as Queries?
>
>
>
>
> 2013/12/5 Wesley Oliveira <wesley em rgsystem.com.br>
>
> > Obrigado pessoal!
> >
> > Analisamos nossa rotina direitinho e vimos que não era ela o problema.
> > O problema eram as consultas antigas do sistema que utilizavam um
> > método errado. Não abria transação e não liberava as queries criadas.
> > Isso fazia tanto a memória do Firebird bater picos de 200MB pra gerar
> > uma turma e não liberar memória, quanto a memória utilizada pelo
> > sistema subir e não liberar também, ficando acima de 50MB pra uma
> > turma.
> >
> > Após os ajustes, a memória do FB para em 11,9MB.. De vez em quando
> > sobe pra 25MB mas logo volta pra 11... e a memória utilizada pelo
> > sistema também ficou bem abaixo do que estava antes!
> >
> > Obrigado pelas dicas!
> > Att.
> >
> > Wesley Oliveira
> > Programador de Sistemas de Informação
> > RG System Informática
> > Fone:     +55 (27) 3727-1127
> > Celular:  +55 (27) 99606-0038
> >
> > -----Mensagem original-----
> > De: lista [mailto:lista-bounces em firebase.com.br] Em nome de W O
> > Enviada em: quarta-feira, 4 de dezembro de 2013 23:33
> > Para: FireBase
> > Assunto: Re: [firebase-br] Consumo de memória muito Alto (Não libera)
> >
> > ¿Todos tus SELECTs finalizan con un COMMIT?
> >
> > Si no es así, podrías continuar teniendo transacciones abiertas las
> > cuales por supuesto consumen memoria.
> >
> > Saludos.
> >
> > Walter.
> >
> >
> >
> >
> > 2013/12/4 Wesley Oliveira <wesley em rgsystem.com.br>
> >
> > > Olá pessoal!
> > >
> > >
> > >
> > > Correndo o risco de parecer bobo, mas uma questão está me
> > > perturbando essa
> > > semana:
> > >
> > >
> > >
> > > Nosso sistema é baseado num Servidor DataSnap com Firebird 2.5
> > SuperServer.
> > >
> > > Ao gerar os boletins dos alunos de uma turma, por exemplo, o sistema
> > > dispara várias funções entre servidor/banco de dados. Algumas stored
> > > procedures são executadas, tabelas temporárias são alimentadas e
> > > consultadas pra depois serem esvaziadas e por aí vai. Tudo comandado
> > > pelo servidor da aplicação.
> > >
> > >
> > >
> > > Ao iniciar o processo, o FB está consumindo 22MB de memória e, para
> > > uma turma de 30 alunos por exemplo, ao final da execução, o consumo
> > > está beirando os 250MB!
> > >
> > > Sim, são rotinas pesadas, vários registros pra cada aluno em
> > > diversas tabelas, SUMS, COUNTS, tem de tudo nessa rotina...
> > >
> > >
> > >
> > > Aí eu penso: Quando acabar, toda essa memória será liberada, certo?
> > > Errado... só libera quando encerra o servidor do sistema.... E nesse
> > > fim de ano, alguns clientes estão gerando os boletins de TODAS as
> > > turmas várias vezes por dia... Imagina o tanto que isso tá
> > > consumindo dos pobres servidores, certo?
> > >
> > >
> > >
> > > Então eu pergunto: Por que isso acontece?
> > >
> > >
> > >
> > > Eu utilizo para as consultas ao BD o TDBXCommand com TDBXReader do
> > > Delphi e, sempre que um command ou um reader é criado, é destruído
> > > ao final da “participação” dele na rotina. Já dei Free, FreeAndNil e
> > > nada libera a memória...
> > >
> > >
> > >
> > > Alguma boa alma poderia me dar alguma dica?
> > >
> > > Wesley Oliveira
> > > Programador de Sistemas de Informação
> > >
> > > RG System Informática
> > > Fone:     +55 (27) 3727-1127
> > > Celular:  +55 (27) 99606-0038
> > >
> > >
> > >
> > > ______________________________________________
> > > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > > http://www.firebase.com.br/fb/artigo.php?id=1107
> > > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> > >
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
> >
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
>
>
>
> --
> Frederico Godoi
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br Para
> saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista