Lentidão em 3 camadas

Delphi

08/06/2004

Pessoal, estou desenvolvendo um sistema com SQL SERVER 2000 + ADO.
Quando faço uma consulta, apenas utilizando o componente TADODataSet ela demora 4 segundos para executar.

Se acrescento um TDataSetProvider e um ClientDataSet o tempo de resposta passa a ser de 40 segundos, via MIDAS.

Esse overhead todo é por causa do sistema multicamadas do delphi (tecnologia MIDAS)?

Gostaria de comentários a respeito e saber como vocês estão resolvendo esse problema.

Agradeço desde já a atenção.

Saudações,

Guilherme


Gmcouto

Gmcouto

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

08/06/2004

Colega,

Nunca trabalhei com esta arquitetura em 3 camadas (ADO), uso dbExpress, mas o problema [b:bc127d5335]pode ser[/b:bc127d5335] na configuração do TClientDataSet...
A propriedade ´PacketRecords´ determina o número de registros que serão ´fetched´ para o cliente, o valor default eh ´-1´, ou seja, todos os registros, e isso em tabelas grandes é o caos... configure com o valor que achar adequado baseado nos seus testes (normalmente uso 1000), o fetch ocorrerá conforme necessário...

Espero ter ajudado...
T+


GOSTEI 0
Gmcouto

Gmcouto

08/06/2004

Vinicius,

Tentei mudar essa propriedade, mas ele continua buscando todos os registros (30.000 no caso!).

É necessário configurar mais alguma coisa?

Li no help alguma coisa a respeito do evento ´BeforeGetRecords´ e deixa a entender que deveria utiliza-lo mas não diz como.

Obrigado pela atenção!

Guilherme


Colega, Nunca trabalhei com esta arquitetura em 3 camadas (ADO), uso dbExpress, mas o problema [b:a2803af2c6]pode ser[/b:a2803af2c6] na configuração do TClientDataSet... A propriedade ´PacketRecords´ determina o número de registros que serão ´fetched´ para o cliente, o valor default eh ´-1´, ou seja, todos os registros, e isso em tabelas grandes é o caos... configure com o valor que achar adequado baseado nos seus testes (normalmente uso 1000), o fetch ocorrerá conforme necessário... Espero ter ajudado... T+



GOSTEI 0
Vinicius2k

Vinicius2k

08/06/2004

Guilherme,

Você está correto... em 3 camadas é necessário informar ao Provider a partir de qual registro ele deve efetuar o fecth para o Client... esquecí-me disto...
A forma como uso é praticamente a mesma descrita no Help do Delphi... e é trabalhada no evento BeforeGetRecords do CDS desta forma:
procedure TForm1.ClientDataSet1BeforeGetRecords(Sender: TObject; var OwnerData: OleVariant);
var
  UltimoValor: OleVariant;
  CDSTemp: ClientDataSet;
begin
  if ClientDataSet1.Active then
    begin
      CDSTemp:= ClientDataSet.Create(Form1);
      try
        CDSTemp.CloneCursor(ClientDataSet1, True);
        CDSTemp.FetchOnDemand:= False;
        CDSTemp.Last;
        UltimoValor:= CDSTemp.Fields[0].AsString;
        CDSTemp.Close;
      finally
        CDSTemp.Free;
      end;
    end 
  else UltimoValor:= null;
  OwnerData:= UltimoValor;
end;


Espero ter ajudado agora...
T+


GOSTEI 0
Gmcouto

Gmcouto

08/06/2004

Vinicus,

Essa foi a dificuldade que eu tive. Não precisa escrever nada nos eventos do TDataSetProvider?
[]s,

Guilherme


GOSTEI 0
POSTAR