Ir para conteúdo
  • Cadastre-se

dev botao

Manter a conexão fechada Firebird


RibaSoft
Ver Solução Respondido por EMBarbosa,
  • Este tópico foi criado há 318 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá a todos!

Gostaria de saber qual a melhor forma para se proceder...

Uso => Lazarus, Firebid 2.5, TIbConnection, TSQLQuery, TSQLTransaction, TDataSource, TDBGrid

Sempre que fecho um Form, depois de executar um commit (Transaction.Commit), ou antes de carregar um DBgrid (Query.Open), eu executo o "Connection.Close(True)" para fechar a conexão fazendo com que eu possa ter sempre os dados que estão no banco e não na memoria.

Essa seria a forma mais correta? Ou existe uma forma melhor?

Desde já agradeço a atenção de todos

Link para o comentário
Compartilhar em outros sites

  • Consultores
2 horas atrás, RibaSoft disse:

Gostaria de saber qual a melhor forma para se proceder...

Uso => Lazarus, Firebid 2.5, TIbConnection, TSQLQuery, TSQLTransaction, TDataSource, TDBGrid

Sempre que fecho um Form, depois de executar um commit (Transaction.Commit), ou antes de carregar um DBgrid (Query.Open), eu executo o "Connection.Close(True)" para fechar a conexão fazendo com que eu possa ter sempre os dados que estão no banco e não na memoria.

Essa seria a forma mais correta? Ou existe uma forma melhor?

Olá,

  Eu não tenho trabalhado com esses componentes do Lazarus, mas acredito que não seja necessário você executar um Connection.Close depois de executar o Commit.

  Pelo menos em teoria, o Commit deveria fechar a transação e qualquer comunicação com o BD. Assim, apenas isso deveria bastar.

  Da mesma maneira não deveria ser necessário você executar o close antes de carregar um DBgrid.

  • Curtir 2

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Então...

Aparente ele não fecha pois quando dou um commit, ele mostra os dados conforme o terminal que estou usando, se houve alteração por outro terminal ele não mostra, a não ser que eu feche e abra novamente a aplicação. mas fazendo esse Connection.Close(True), ai sim ele busca as informações novamente no banco de dados, e se algum outro terminal fez alguma modificação dai consigo vê-las.

Obrigado pela atenção 🙏

 

Link para o comentário
Compartilhar em outros sites

  • Consultores
14 horas atrás, RibaSoft disse:

Então...

Aparente ele não fecha pois quando dou um commit, ele mostra os dados conforme o terminal que estou usando, se houve alteração por outro terminal ele não mostra, a não ser que eu feche e abra novamente a aplicação. mas fazendo esse Connection.Close(True), ai sim ele busca as informações novamente no banco de dados, e se algum outro terminal fez alguma modificação dai consigo vê-las.

Obrigado pela atenção 🙏

 

Será que não está usando o CommitRetaining? Isso poderia explicar manter a conexão.

  • Curtir 2

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Aparentemente, eu falei besteira, mas continuo precisando de ajuda.

Quando acesso os dados com o ibexpert e mantenho a tabela aberta, não consigo acessar do meu sistema, provavelmente porque o ibexpert de segurar a conexão aberta, já no meu sistema se a tabela esta aberta (DBGrid Carregado), eu consigo acessar pelo ibexpert pois os dados então em memoria do meu sistema, ou seja meu sistema não segura a conexão.

O que eu estou precisando é que a cada consulta que eu faça no meu sistema ele busque as informações no banco de dados e não as que estão na memoria, e é isso que eu resolvi fechando a conexão antes de cada select com o IBConnection.Close(True); Pois preciso das informações atuais caso outro terminal faça alguma alteração.

E é isso que eu queria saber, qual a melhor maneira de fazer.

Pode ser que seja uma pergunta besta, mas pesquisando a respeito vi muita gente com a mesma dúvida e não consegui achar outra solução.

Editado por RibaSoft
Link para o comentário
Compartilhar em outros sites

  • Consultores
  • Solution
Em 03/10/2019 at 23:17, RibaSoft disse:

Quando acesso os dados com o ibexpert e mantenho a tabela aberta, não consigo acessar do meu sistema, provavelmente porque o ibexpert de segurar a conexão aberta, já no meu sistema se a tabela esta aberta (DBGrid Carregado), eu consigo acessar pelo ibexpert pois os dados então em memoria do meu sistema, ou seja meu sistema não segura a conexão.

Isso pode ser o formato da conexão. Não tenho certeza que seja como você diz que os dados estão em memória.

Em 03/10/2019 at 23:17, RibaSoft disse:

O que eu estou precisando é que a cada consulta que eu faça no meu sistema ele busque as informações no banco de dados e não as que estão na memoria, e é isso que eu resolvi fechando a conexão antes de cada select com o IBConnection.Close(True); Pois preciso das informações atuais caso outro terminal faça alguma alteração.

Isso está relacionado ao controle de transações. Eu particularmente não tenho muita experiência com esse componente IBConnection. Mas se o jeito de fechar uma transação é usar o Close, então é isso que você precisa fazer.

Mas o ideal é fechar a transação assim que ela deixar de de ser útil e não antes do próximo Select.

Pra ser mais preciso, eu necessito de um programa que exemplifique o seu problema para analisar aqui na minha máquina.

  • Curtir 2
  • Obrigado 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...

Olá, só reportando...

Procurei, pesquisei e testei muito sobre o assunto e até agora o que descobri é que quando o form é destruído, mesmo sem fechar a conexão (IBConnection.Close(True)) ele pega os dados novos no DB, mas se não destruir o form não a nada que de certo, testei varias coisas, varias procedimentos do Transaction, Query, IBConnection, DBGrid e nada.

Só o IBConnection.Close(True) que funciona mesmo. Daí como só da problema se estiver em rede, eu criei uma configuração "ModoRede: Boolean" onde se a aplicação for local deixo como False se for em rede deixo como true para fechar a conexão (IBConnection.Close(True)) antes de cada SQLQuery.Open.

Desculpe ser repetitivo na escrita, é que estou tentando deixar bem claro o que acontece.

Assim que possível anexo um .ZIP aqui com um exemplo da aplicação.

DEUS abençoe a todos.

Obs: Se acharem que o Tópico não agrega nada aos usuários pode fecha-lo, pois não sanou 100% da dúvida, mas na gambiarra ta indo 😊. Brigadão.

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...
  • Moderadores
Em 29/04/2023 at 19:29, RibaSoft disse:

Nossa que mancada, pesquisei pelo assunto e cai nesse post, depois de fazer a pergunta que percebi que eu mesmo criei esse post a tempos atras 🫣

E até hj continuo com o mesmo problema 😔

Que estranho pois cita que funcionou ao final informando para fechar o tópico, mesmo não sanando 100%

  • Curtir 1
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

Sim, na verdade a 4 anos atraz desisti de fazer meu sistema funcinar em rede por causa de não funcionar direito, dai falei que podia fechar o topico, pois havia desistido, mas agora 4 anos depois, vi que não tem jeito, vou ter que fazer meu sistema funcionar em rede, dai pesquisando novamente o mesmo assunto cai nesse topico e só depois de fazer novamente a mesma pergunta percebi que era o topico que eu tinha criado a muito tempo atraz e não consegui apagar a pergunta, dai deixei a explicação da minha confusão.

Eu esperava alguma configuração no componente mas percebi em em alguns selects eu não posso pegar dados novos do banco, e em outros sim como o return do insert por exemplo que, dai estou desconectando do banco de dados em alguns lugares do codigo e em outros não.

ou seja acredito continuar na gambiarra, mas depois de 4 anos de estudo, a gambiarra ta menos feia e mais funcional.

Mas uma vez peço desculpas pela confusão.

DEUS abençoe a todos. 🤗

Editado por RibaSoft
Link para o comentário
Compartilhar em outros sites

  • Moderadores

Talvez você não esteja configurando o isolamento das transações.

Se estiver em SNAPSHOT por exemplo, essa transação só vai enxergar as alterações feitas antes do início da transação, que parece ser o que você está relatando.

https://firebirdsql.org/file/documentation/chunk/en/refdocs/fblangref40/fblangref40-transacs.html

  • Curtir 1
Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

Sim, pelo que entendi parece ser algo do tipo mesmo.

Vou dar um exemplo aqui.

Se eu pego dados de um campo no PC1 eu consigo pegar os mesmos dados no PC2, nesse momento é como se eu tivesse conectado com os dois PCs ao mesmo campo, mas no momento em que eu fizer uma alteração através de um desses dois pcs o outro não consegue fazer mais nada (deadlock) a não ser queu feche a conexão e conecte novamente nesse campo, oq faz todo sentido.

Dai pensei em colocar um fechamento de conexão em um evento antes de um open, ou execute, mas dai vai zoar td em casos que tenho que fazer mais de uma alteração em tabelas diferentes antes de dar um commit. 

Acredito que meu problema seja falta de conhecimento em processos em banco de dados mesmo, dai consegui resolver dessa vez, fechando a conexão manualmente em cada caso. Talvez não seja uma gambiarra como eu disse e sim o jeito certo a se fazer, mas como não tenho o conhecimento necessário não sei dizer se é gambiarra ou não.

Agradeço o interesse em me ajudar, muito obrigado. 🤗

Editado por RibaSoft
Link para o comentário
Compartilhar em outros sites

  • Consultores
17 horas atrás, RibaSoft disse:

Se eu pego dados de um campo no PC1 eu consigo pegar os mesmos dados no PC2, nesse momento é como se eu tivesse conectado com os dois PCs ao mesmo campo, mas no momento em que eu fizer uma alteração através de um desses dois pcs o outro não consegue fazer mais nada (deadlock) a não ser queu feche a conexão e conecte novamente nesse campo, oq faz todo sentido.

É assim mesmo que funciona. Pesquise mais sobre concorrência de transações e isolamento de transações.

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Este tópico foi criado há 318 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.