[firebase-br] Dica para fechar a Transacao de Leitura do DBExpress

Pha-Lista lista em pha.com.br
Ter Jun 21 15:03:37 -03 2005


Internamente o DBExpress abre uma transacao para leitura se nao hourve nenhuma iniciada explicitamente, esta transacao fica em aberto (pelo meno no driver do Delphi 6), se estiver tendo problemas com perfomance por causa desta transacao tente utilizar o exemplo abaixo para fechar a conexao e com isso a transacao, quando for necessario o proprio DBExpress abrira novamente a conexao.

Cuidado com a propriedade PacketRecords > 0, pois o ClientDataSet nao fechara o SQLDataSet ate que todos os registros tenham sido carregados imposibilitando o fechamento da transação, se for necessario crie um metodo dos ClientDataSets 

serem carregado em segundo plano ao poucos para isso voce podera utilizar um Action, um Timer ou usar o evneto OnIdle do TApplication. 


procedure TForm1.SQLConnection1AfterConnect(Sender: TObject);
begin
  IniciadaEm := Now; // Variavel definida no Form ou Data Modulo da Conexao
  Timer1.Interval := 5000; // checa a cada 5 segundos
  Timer1.Enabled := True;
end;

procedure TForm1.SQLConnection1AfterDisconnect(Sender: TObject);
begin
  IniciadaEm := 0;
  Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  I: Integer;
begin
  // Verifica se a conexao pode ser fechada
  if (IniciadaEm <> 0) and
     // Configurei para tem tentar fechar depois de 30 minutos
     (DateUtils.MinutesBetween(Now, IniciadaEm) > 30) and
     (SQLConnection1.Connected) and
     (SQLConnection1.ConnectionState = csStateOpen) and
     (not SQLConnection1.InTransaction) then begin

    // Verifica se nao ha nenhum SQLDataSet aberto
    for I := 0 to SQLConnection1.DataSetCount - 1 do
      if (SQLConnection1.DataSets[I].State <> dsInActive) then Exit;

      SQLConnection1.Close;
   end;
end;


Existem outra formas mais eficientes, mais os componentes ou o driver precisariam ser alterados.

Para quem utiliza o DBExpress e o Midas, existe um site muito interessante www.distribucon.com

Pode ser que no Delphi 2005, isso ja esteja corrigido.

PHA
Nova Odessa / SP - Brazil





Mais detalhes sobre a lista de discussão lista