Avaliação do Tópico:
  • 0 votos - 0 Média
  • 1
  • 2
  • 3
  • 4
  • 5
Fechar conexão
#1
Boa dia pessoal, estou tendo um problema na hora de finalizar meu sistema com uma conexão ativa, por exemplo, no meu sistema tenho algumas tabelas de conexão com o banco de dados e em todos os métodos necessários que comunicam com o banco de dados seja por insert ou por edit, estou associando uma variável que vai herdar do método da conexão com o banco, e depois de feito o procedimento eu libero essa variável, porém na hora de finalizar meu sistema utilizando o parâmetro ReportMemoryLeaksOnShutdown do Delphi, eu obtenho o retorno com muita perda de memória, e todos os objetos estão relacionados aos componentes ORMBR, qual é a melhor forma de liberá-los da memória após o uso? Alguém poderia me fornecer essa informação? No link abaixo tem bem certo os locais que estão retornando o memory leak.

http://prntscr.com/nqx57d

Att. Maikon


Arquivo(s) anexado(s) Miniatura(s)
   
Responder
#2
Boa tarde pessoal, depois de muitos testes encontrei o problema, eu estava liberando todas as variáveis instanciadas ao invés de liberar somente as criadas, por exemplo, na hora de adicionar um registro no banco de dados eu utilizava variavel.create e depois dava um variavel.free, até ai tudo funcionava, o problema era quando eu instanciava um registro na varivel e liberava da memória, exemplo, Variavel := TRegistro(oContainerRegistro.current) e depois de utilizada, variavel.free, isso estava alem de gerando alguns access violation também gerava os memoryleaks.

Obrigado pela atenção.

Att. Maikon
Responder
#3
(20-05-2019, 03:32 PM)MaikonPanazzolo Escreveu: Boa tarde pessoal, depois de muitos testes encontrei o problema, eu estava liberando todas as variáveis instanciadas ao invés de liberar somente as criadas, por exemplo, na hora de adicionar um registro no banco de dados eu utilizava variavel.create e depois dava um variavel.free, até ai tudo funcionava, o problema era quando eu instanciava um registro na varivel e liberava da memória, exemplo, Variavel := TRegistro(oContainerRegistro.current) e depois de utilizada, variavel.free, isso estava alem de gerando alguns access violation também gerava os memoryleaks.

Obrigado pela atenção.

Att. Maikon
Show, sinal que está pegando a manha da programação POO, no inicio eu apanhei muito tb, em entender que quem era o objeto, onde eles estava, o porque não poder libera-lo, mesmo parecendo que eu o tinha criado, temos que ter bastante atenção, mas é gostoso d+ poo.

  Isaque Pinheiro
  Fundador do Projeto ORM Brasil
  ORMBr SAC - Assine e faça parte dessa história ajudando o projeto a crescer.

Responder
#4
Boa tarde pessoal, desculpe-me a pergunta, tive que mudar algumas questões da conexão e não estou mais centralizando os componentes em um DataModulo como eu estava fazendo antes, tive que mudar e criar em tempo de execução a criação destes mesmo componentes, mas isso fez voltar o problema de memoryleak rsrsrs. Isso está ocorrendo mesmo eu criando e depois destruindo os componentes. Alguém pode me orientar quanto a isso? Segue as prints de como está criando e como está destruindo.

Criação - http://prntscr.com/nrit82

Destruição - http://prntscr.com/nritmj
Responder
#5
(21-05-2019, 02:34 PM)MaikonPanazzolo Escreveu: Boa tarde pessoal, desculpe-me a pergunta, tive que mudar algumas questões da conexão e não estou mais centralizando os componentes em um DataModulo como eu estava fazendo antes, tive que mudar e criar em tempo de execução a criação destes mesmo componentes, mas isso fez voltar o problema de memoryleak rsrsrs. Isso está ocorrendo mesmo eu criando e depois destruindo os componentes. Alguém pode me orientar quanto a isso? Segue as prints de como está criando e como está destruindo.

Criação - http://prntscr.com/nrit82

Destruição - http://prntscr.com/nritmj
Não tenho certeza e nem fiz teste, mas se você criar o Datasource.Create(fdMemTable) o FDMentable pode pertencer ao Datasource, e como vc está liberando na ordem 1o o Datasource, ele pode estar liberado o FDmentable e dai não tem mais nenhum FDMentable para dar free.

Tente mudar a ordem.

  Isaque Pinheiro
  Fundador do Projeto ORM Brasil
  ORMBr SAC - Assine e faça parte dessa história ajudando o projeto a crescer.

Responder
#6
(21-05-2019, 04:28 PM)Isaque Pinheiro Escreveu:
(21-05-2019, 02:34 PM)MaikonPanazzolo Escreveu: Boa tarde pessoal, desculpe-me a pergunta, tive que mudar algumas questões da conexão e não estou mais centralizando os componentes em um DataModulo como eu estava fazendo antes, tive que mudar e criar em tempo de execução a criação destes mesmo componentes, mas isso fez voltar o problema de memoryleak rsrsrs. Isso está ocorrendo mesmo eu criando e depois destruindo os componentes. Alguém pode me orientar quanto a isso? Segue as prints de como está criando e como está destruindo.

Criação - http://prntscr.com/nrit82

Destruição - http://prntscr.com/nritmj
Não tenho certeza e nem fiz teste, mas se você criar o Datasource.Create(fdMemTable) o FDMentable pode pertencer ao Datasource, e como vc está liberando na ordem 1o o Datasource, ele pode estar liberado o FDmentable e dai não tem mais nenhum FDMentable para dar free.

Tente mudar a ordem.

Bom dia, na verdade eu estava fazendo "cagada" mesmo rsrsr, estava criando 4 vezes e apenas destruindo 3 vezes, corrigi isso e foi 100% rsrs. Agora estou com outra dúvida, para deixar mais claro, estou desenvolvendo um aplicativo de acesso remoto e na hora que um dos clientes desconecta, eu faço a limpeza desse registro na base, porém ao tentar desconectar estou obtendo o erro "Cannot perform this operation on a closed dataset". Porém isso ocorre em um OpenWhere rsrs, teoricamente não deveria dar esse erro em um open, correto?
Responder
#7
(27-05-2019, 08:06 AM)MaikonPanazzolo Escreveu:
(21-05-2019, 04:28 PM)Isaque Pinheiro Escreveu:
(21-05-2019, 02:34 PM)MaikonPanazzolo Escreveu: Boa tarde pessoal, desculpe-me a pergunta, tive que mudar algumas questões da conexão e não estou mais centralizando os componentes em um DataModulo como eu estava fazendo antes, tive que mudar e criar em tempo de execução a criação destes mesmo componentes, mas isso fez voltar o problema de memoryleak rsrsrs. Isso está ocorrendo mesmo eu criando e depois destruindo os componentes. Alguém pode me orientar quanto a isso? Segue as prints de como está criando e como está destruindo.

Criação - http://prntscr.com/nrit82

Destruição - http://prntscr.com/nritmj
Não tenho certeza e nem fiz teste, mas se você criar o Datasource.Create(fdMemTable) o FDMentable pode pertencer ao Datasource, e como vc está liberando na ordem 1o o Datasource, ele pode estar liberado o FDmentable e dai não tem mais nenhum FDMentable para dar free.

Tente mudar a ordem.

Bom dia, na verdade eu estava fazendo "cagada" mesmo rsrsr, estava criando 4 vezes e apenas destruindo 3 vezes, corrigi isso e foi 100% rsrs. Agora estou com outra dúvida, para deixar mais claro, estou desenvolvendo um aplicativo de acesso remoto e na hora que um dos clientes desconecta, eu faço a limpeza desse registro na base, porém ao tentar desconectar estou obtendo o erro "Cannot perform this operation on a closed dataset". Porém isso ocorre em um OpenWhere rsrs, teoricamente não deveria dar esse erro em um open, correto?
Quando vc trabalha com componente em memória, como o TClienteDataSet ou FDMemTable ou outro que atenda cache em memória, vc não deve chamar .CLOSE, pois isso remove todos os TFields do componente, para limpar os dados deve usar .DataSet.Empty

  Isaque Pinheiro
  Fundador do Projeto ORM Brasil
  ORMBr SAC - Assine e faça parte dessa história ajudando o projeto a crescer.

Responder
#8
(27-05-2019, 10:43 AM)Isaque Pinheiro Escreveu:
(27-05-2019, 08:06 AM)MaikonPanazzolo Escreveu:
(21-05-2019, 04:28 PM)Isaque Pinheiro Escreveu:
(21-05-2019, 02:34 PM)MaikonPanazzolo Escreveu: Boa tarde pessoal, desculpe-me a pergunta, tive que mudar algumas questões da conexão e não estou mais centralizando os componentes em um DataModulo como eu estava fazendo antes, tive que mudar e criar em tempo de execução a criação destes mesmo componentes, mas isso fez voltar o problema de memoryleak rsrsrs. Isso está ocorrendo mesmo eu criando e depois destruindo os componentes. Alguém pode me orientar quanto a isso? Segue as prints de como está criando e como está destruindo.

Criação - http://prntscr.com/nrit82

Destruição - http://prntscr.com/nritmj
Não tenho certeza e nem fiz teste, mas se você criar o Datasource.Create(fdMemTable) o FDMentable pode pertencer ao Datasource, e como vc está liberando na ordem 1o o Datasource, ele pode estar liberado o FDmentable e dai não tem mais nenhum FDMentable para dar free.

Tente mudar a ordem.

Bom dia, na verdade eu estava fazendo "cagada" mesmo rsrsr, estava criando 4 vezes e apenas destruindo 3 vezes, corrigi isso e foi 100% rsrs. Agora estou com outra dúvida, para deixar mais claro, estou desenvolvendo um aplicativo de acesso remoto e na hora que um dos clientes desconecta, eu faço a limpeza desse registro na base, porém ao tentar desconectar estou obtendo o erro "Cannot perform this operation on a closed dataset". Porém isso ocorre em um OpenWhere rsrs, teoricamente não deveria dar esse erro em um open, correto?
Quando vc trabalha com componente em memória, como o TClienteDataSet ou FDMemTable ou outro que atenda cache em memória, vc não deve chamar .CLOSE, pois isso remove todos os TFields do componente, para limpar os dados deve usar .DataSet.Empty
Essa é a questão haha, em nenhum momento eu dou close, na verdade os únicos comandos que estou utilizando são o edit, insert, save, open e openwhere
Responder


Possíveis Tópicos Relacionados...
Tópico: Autor Respostas: Visualizações: Última Mensagem
  Conexão com banco de dados MaikonPanazzolo 0 212 04-06-2019, 11:59 AM
Última Mensagem: MaikonPanazzolo
  ORMBr - Como criar uma conexão ? Isaque Pinheiro 2 4,829 24-09-2017, 11:57 PM
Última Mensagem: juliomar
  Diagrama de Classe de Conexão Isaque Pinheiro 0 2,018 23-09-2016, 02:46 PM
Última Mensagem: Isaque Pinheiro

Saltar Fórum:


usuários a ver este tópico: 2 Visitante(s)