Fórum Muito tempo para desconectar do Banco (fb1.0 Revisado) #42890
08/03/2004
0
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;
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
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)