[firebase-br] Firebird Congelado
Carlos Andrade
krlosgilson em gmail.com
Seg Fev 13 12:52:24 -03 2017
Olá Gladiston, vou fazer exatamente isso pra ver se desvendo esse
mistério de vez. No Delphi, uso os componentes da paleta dbexpress, em
meu código não utilizo "commit" nas transações, é exatamente assim:
function InsertRecord(qrysql: TSqlQuery; msg_result: boolean; Table,
Fields, Values: string): Boolean;
begin
result := false;
OpenConnection;
with qrysql do
begin
Close;
Sql.clear;
Sql.add('insert into '+Table+' ('+Fields+') values ('+Values+')');
ExecSql;
result := true;
if msg_result then
Mensagem('Registro gravado com sucesso.',0);
end;
CloseConnection;
end;
E em alguns formulários utilizo ClientDataSet, a gravação dos registros
é assim:
DM.CdsClientes.Append;
//Preenchimento dos campos aqui
DM.CdsClientes.Post;
DM.CdsClientes.ApplyUpdates(-1);
A sua Procedure "FormCloseQuery" se enquadra na forma com estou fazendo?
Em 13/02/2017 08:51, Gladiston Santana escreveu:
> Minha impressão é que uma transação ficou perdida, causando um tempo de
> aguardo até o desbloqueio, mas como está "perdida" dará dead lock no final
> do processo.
> Como há a impressão de "congelamento", ao parar o serviço e reiniciar, você
> acaba matando todos os processos, incluindo o causador, a transação
> pendente.
> Mas é temporário até que o processo repita novamente, teria de descobrir
> onde no programa abre uma transação que não culmine no commit.
> Temporariamente, você poderia colocar no seu programa, no onclose algo
> assim:
> procedure TfmXXXXX.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
> begin
> try
> Application.OnHint := nil;
> if (dm.MyConn.Connected) then
> begin
> if Assigned(dm.MyConn.Transaction) then
> begin
> if dm.MyConn.Transaction.Active then
> begin
> dm.MyConn.Transaction.Commit;
> end;
> end;
> if dm.FB_TRANSACTION_RW.Active then
> begin
> dm.FB_TRANSACTION_RO.Commit;
> end;
> if dm.FB_TRANSACTION_RO.Active then
> begin
> dm.FB_TRANSACTION_RO.Commit;
> end;
> if dm.MyConn.Connected then
> dm.MyConn.Close;
> end;
> finally
> CanClose:=true;
> end;
> end;
>
> Algo que também poderia ser feito é escrever um arquivo de log de quando
> uma estação conectou seu app e quando desconectou, isso daria indicios de
> que tem um usuário matando seu app através do gerenciador de tarefas, algo
> que faria uma transação ficar eternamente aberta. As vezes o usuário
> (sempre ele), acha que um processamento tá demorando tempo demais, daí como
> ele é "hacker", aprendeu a matar a tarefa e iniciar de novo, algo que com o
> BD conectado não se deve fazer.
>
> Mas tudo isso é um chute, e um bom chute.
>
> Como o João Marcos disse, você é guerreiro e acredita até o fim.
>
> Vou ser franco com você, o que conseguiu até o momento é uma proeza que só
> conseguistes porque usa o principio da conexão e desconexão.
> Obteria resultados muito melhores com Datasnap, menos dor de cabeça e mais
> performance. A principio porque com o Datasnap, você trabalha offline até
> resolver fazer o sync com o banco, provavelmente numa ação de "Salvar" ou
> ao fechar o form.
>
> Não vale a pena aprender datasnap por autodidatismo, quebra muito a cabeça
> assim, vale mais a pena pagar por um curso online ou presencial(melhor) e
> por a mão na massa com a certeza do acerto.
Mais detalhes sobre a lista de discussão lista