Muito tempo para desconectar do Banco (fb1.0 Revisado)

Firebird

08/03/2004

Caros,
montei a rotina abaixo para eleminar alguns registros do banco de dados (registros desnecessarios). Só que, ao chegar na linha


dm.Conexao.Connected := False;

[[[ PROBLEMA AQUI ]]]

resulta num problema q desconheco. (processo as vezes muito lento, aoponto de travar tudo).

Tem hora, que desconecta na hora (menos de 2 segundos), numa outra hora, demora uns 5 minutos. Esta atualizacao é feita todos os dias (1 vez ao dia).
Hoje chegou ao ponto de dar pau na memoria do servidor devido ao

dm.conexao.connected := false;

uso dbxpress
firebird
delphi7
win2000server





procedure TfrmAtualizaDBF.btnEliminaFornObsoletosClick(Sender: TObject);
var HoraIni, HoraFim : TTime;
FornParaDeletar : array[1..500] of Integer;
i : Integer;
begin

Memo1.Clear;

Application.ProcessMessages;

for i := Low(FornParaDeletar) to High(FornParaDeletar) do begin
FornParaDeletar[i] := 0;
end;


if not dm.Conexao.Connected then
dm.Conexao.Connected := True;


HoraIni := Now;

Memo1.Lines.Add(´´);
Memo1.Lines.Add(´==== ELIMINANDO FORNECEDORES OBSOLETOS ====´);

Memo1.Lines.Add(´´);


with dm do begin
cdsFornec.Open;

//--------- DECLARA QDE DE VETORES (FORNECEDORES)


cdsFornec.First;


sqlGenerica2.SQL.Text := ´SELECT FIRST 1 CODIGOFORNECEDOR FROM PRODUTOS WHERE CODIGOFORNECEDOR = :CODIGO´;


Memo1.Lines.Add(´Aguarde, checando Arquivo de Fornecedores´);
Memo1.Lines.Add(´´);


//------------ CHECANDO SE HAVERA NECESSIDADE DE EXCLUIR ALGUM FORNECEDOR

while not cdsFornec.Eof do begin

sqlGenerica2.ParamByName(´CODIGO´).AsInteger := cdsFornecCODIGO.AsInteger;

sqlGenerica2.Open;

if sqlGenerica2.FieldByName(´CODIGOFORNECEDOR´).AsInteger = 0 then begin
FornParaDeletar[cdsFornecCODIGO.AsInteger] := cdsFornecCODIGO.AsInteger;

end;

sqlGenerica2.Close;
sqlGenerica.Close;

cdsFornec.Next;
end;

cdsFornec.Close;

end;



//-------------- EXCLUIR FORNECEDORES AGORA

for i := Low(FornParaDeletar) to High(FornParaDeletar) do begin
if FornParaDeletar[i] > 0 then begin
Memo1.Lines.Add(´Excluíndo Fornecedor de Código : ´+IntToStr(i));
dm.sqlGenerica.SQL.Text := ´DELETE FROM FORNECEDORES WHERE CODIGO = ´+QuotedStr(IntToStr(FornParaDeletar[i]));
dm.Gravar(1);
end;
end;





Memo1.Lines.Add(´´);


//------------- FIM

try
if dm.Conexao.InTransaction then
Memo1.Lines.Add(´InTransação...´);

Memo1.Lines.Add(´ Desconectando do Banco...´ + TimeToStr(Now));
Memo1.Lines.Add(´´);

dm.Conexao.Connected := False;
[[[ PROBLEMA AQUI ]]]

HoraFim := Now;
Memo1.Lines.Add(´ <Fim> - Tempo decorrido: ´+TimeToStr(HoraFim-HoraIni));
Memo1.Lines.Add(´´);
ShowMessage(´Pronto...´);
except
Memo1.Lines.Add(´ Falha ao Desconectar do Banco´);
Memo1.Lines.Add(´´);
ShowMessage(´Falha ao Desconectar do Banco´);
end;


---

coloque esta rotina analizarem, se for o caso
//======================= GRAVAR NO BANCO DE DADOS

function Tdm.Gravar(NumeroTransacao: Integer) : Boolean;
var Transacao : TTransactionDesc;
begin
Result := True;
try

//-----------------INICIA TRANSACAO

Transacao.TransactionID := NumeroTransacao;
Transacao.IsolationLevel := xilREADCOMMITTED;
Conexao.StartTransaction(Transacao);



if sqlGenerica.SQL.Text <> ´´ then
sqlGenerica.ExecSQL;


Conexao.Commit(Transacao);


except
//---------------FALHA NO COMMIT

on Exc:Exception do
begin
Conexao.Rollback(Transacao);

MessageDlg(´Problemas na gravação dos dados! ´+#13+13+
´Erro : ´+ Exc.Message, mtError, [mbok], 0);

Result := False;
end;
//----------FIM FALHA NO COMMIT

end;

sqlGenerica.Close;

end;


Pedih

Pedih

Curtidas 0
POSTAR