[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