Autor Téma: firedac problem s pamatou  (Přečteno 4849 krát)

Offline wajco

  • Nováček
  • *
  • Příspěvků: 33
  • Karma: 1
    • Verze Delphi: XE6
firedac problem s pamatou
« kdy: 08-12-2015, 09:41:24 »
Pri pouziti Firedac pri volani fdquery.open v slucke nastava narast pamate konciaci Out of memory.Pri pouziti BDE zabera stale rovnaku pamat. odskusane to je s query umiestnenym na formulari aj s dynamicky vytvaranym query uvolnoenym voalni open. vyseldok je stale rovnaky. viete poradit nejaku property, ktora by to vyriesila, alebo ide o nejaky bug vo firedacu?

Kód: [Vybrat]

 while True do
    begin
      Randomize;
      FDQuery1.SQL.Text := 'select * from tab where i_tab='+Random(182064).tostring;
      inc(i);
      Label14.Caption := i.ToString();
      Application.ProcessMessages;
      Query1.Open;
    end;

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2698
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:firedac problem s pamatou
« Odpověď #1 kdy: 08-12-2015, 10:37:01 »
FDQuery1  versus Query1?

To je prepis?

Co je to za DB, co je to za driver?
Embarcadero MVP - Czech republic

Offline wajco

  • Nováček
  • *
  • Příspěvků: 33
  • Karma: 1
    • Verze Delphi: XE6
Re:firedac problem s pamatou
« Odpověď #2 kdy: 08-12-2015, 10:41:31 »
FDQuery ma byt vsade, je to TFDQuery, db Informix, ovladac Infx [IBM INFORMIX ODBC DRIVER]
« Poslední změna: 08-12-2015, 10:47:56 od wajco »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2923
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:firedac problem s pamatou
« Odpověď #3 kdy: 08-12-2015, 10:58:12 »
Kód: [Vybrat]

 while True do
    begin
      Randomize;
      FDQuery1.SQL.Text := 'select * from tab where i_tab='+Random(182064).tostring;
      inc(i);
      Label14.Caption := i.ToString();
      Application.ProcessMessages;
      Query1.Open;
    end;
Ja v tom vidim hned nekolik veci, z nichz mi vstava zbytek vlasu na hlave hruzou:
- opakovane uziti Randomize
- rucni matlani SQL dotazu misto pouziti parametrizovaneho dotazu, ktery by v konkretnim pripade umoznil pouzivat stale stejny SQL prikaz a jen menit hodnotu parametru v tele cyklu
- chybna prace s I/O prostredkem -> Po open nenasleduje Close, coz je nejspis pricina toho memory leaku. Spravne by tam melo byt
Kód: Delphi [Vybrat]
  1. Query1.Open;
  2. try
  3.   ...
  4. finally
  5.   Query1.Close;
  6. end
  7.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5297
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:firedac problem s pamatou
« Odpověď #4 kdy: 08-12-2015, 11:01:49 »
Nakoľko FireDAC používam, tak ma otázka zaujala. Pozrel som si vlastnosti FDQuery a zaujal ma DirectExecute. Chcel som si niečo o tom prečítať. Ako to vlastne funguje. Ale nič som nenašiel. A help k FireDAC nemá vyhľadávanie.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline wajco

  • Nováček
  • *
  • Příspěvků: 33
  • Karma: 1
    • Verze Delphi: XE6
Re:firedac problem s pamatou
« Odpověď #5 kdy: 08-12-2015, 11:03:10 »
Kód: [Vybrat]

 while True do
    begin
      Randomize;
      FDQuery1.SQL.Text := 'select * from tab where i_tab='+Random(182064).tostring;
      inc(i);
      Label14.Caption := i.ToString();
      Application.ProcessMessages;
      Query1.Open;
    end;
Ja v tom vidim hned nekolik veci, z nichz mi vstava zbytek vlasu na hlave hruzou:
- opakovane uziti Randomize
- rucni matlani SQL dotazu misto pouziti parametrizovaneho dotazu, ktery by v konkretnim pripade umoznil pouzivat stale stejny SQL prikaz a jen menit hodnotu parametru v tele cyklu
- chybna prace s I/O prostredkem -> Po open nenasleduje Close, coz je nejspis pricina toho memory leaku. Spravne by tam melo byt
Kód: Delphi [Vybrat]
  1. Query1.Open;
  2. try
  3.   ...
  4. finally
  5.   Query1.Close;
  6. end
  7.  

1. close nepomaha, lebo prikaz open v sebe na zaciatku vola close
2. parametrizovane query nepomaha
3. randomize ma byt pred cyklom ano, ale toto tiez nepomoze

tu je upraveny kod, pamat stale narasta

Kód: [Vybrat]
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
  q: TFDQuery;
begin
  i:= 0;
  Randomize;
  while True do
    begin
      FDQuery1.SQL.Text := 'select * from tab where i_tab=:p';
      FDQuery1.ParamByName('p').AsInteger := Random(182064);
      inc(i);
      Label14.Caption := i.ToString();
      Application.ProcessMessages;
      FDQuery1.Open();
    end;
end;
« Poslední změna: 08-12-2015, 11:09:17 od wajco »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5297
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:firedac problem s pamatou
« Odpověď #6 kdy: 08-12-2015, 11:08:42 »
Citace
close nepomaha, lebo prikaz open v sebe na zaciatku vola close
Ale určite sa nevolá, ak nie je dataset aktívny (iba moje presvedčenie).

Z praxe: ak používam parametrizovaný príkaz, tak pred priradením údajov do SQL (parametrov) musím najprv uzavrieť dataset. Ináč sa zmena neprejaví.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2698
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:firedac problem s pamatou
« Odpověď #7 kdy: 08-12-2015, 11:10:37 »
a kdyz je ten select porad stejny?
select * from tab where i_tab= 10 ?
Embarcadero MVP - Czech republic

Offline wajco

  • Nováček
  • *
  • Příspěvků: 33
  • Karma: 1
    • Verze Delphi: XE6
Re:firedac problem s pamatou
« Odpověď #8 kdy: 08-12-2015, 11:10:55 »
Citace
close nepomaha, lebo prikaz open v sebe na zaciatku vola close
Ale určite sa nevolá, ak nie je dataset aktívny (iba moje presvedčenie).

Z praxe: ak používam parametrizovaný príkaz, tak pred priradením údajov do SQL (parametrov) musím najprv uzavrieť dataset. Ináč sa zmena neprejaví.

z unitu FireDAC.Comp.Client

Kód: [Vybrat]
procedure TFDRdbmsDataSet.Open(const ASQL: String; const AParams: array of Variant;
  const ATypes: array of TFieldType);
var
  i: Integer;
begin
  Close;
  if ASQL <> '' then
    Command.SetCommandText(ASQL,
      not (Command.CommandKind in [skStoredProc, skStoredProcNoCrs, skStoredProcWithCrs]) and
      ResourceOptions.ParamCreate);
  if Command.CommandKind in [skStoredProc, skStoredProcNoCrs, skStoredProcWithCrs] then
    Prepare;
  if Params.BindMode = pbByNumber then
    for i := 0 to Params.Count - 1 do
      Params[i].Position := i + 1;
  for i := Low(ATypes) to High(ATypes) do
    if ATypes[i] <> ftUnknown then
      Params[i].DataType := ATypes[i];
  for i := Low(AParams) to High(AParams) do
    Params[i].Value := AParams[i];
  if not (Command.CommandKind in [skStoredProc, skStoredProcNoCrs, skStoredProcWithCrs]) then
    Prepare;
  Open;
end;

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2698
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:firedac problem s pamatou
« Odpověď #9 kdy: 08-12-2015, 11:11:29 »
a kdyz vyhodis Application.ProcessMessages; ?
Embarcadero MVP - Czech republic

Offline wajco

  • Nováček
  • *
  • Příspěvků: 33
  • Karma: 1
    • Verze Delphi: XE6
Re:firedac problem s pamatou
« Odpověď #10 kdy: 08-12-2015, 11:12:15 »
a kdyz je ten select porad stejny?
select * from tab where i_tab= 10 ?

stale rovnaky vysledok:(

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5297
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:firedac problem s pamatou
« Odpověď #11 kdy: 08-12-2015, 11:13:37 »
 :)  Tak potom prečo sa tak správa? Rád by som to vedel.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline wajco

  • Nováček
  • *
  • Příspěvků: 33
  • Karma: 1
    • Verze Delphi: XE6
Re:firedac problem s pamatou
« Odpověď #12 kdy: 08-12-2015, 11:14:17 »
a kdyz vyhodis Application.ProcessMessages; ?

nepomaha

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2698
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:firedac problem s pamatou
« Odpověď #13 kdy: 08-12-2015, 11:14:31 »
A jen pro zajímavost: kdyz das misto * nejaky konkretni sloupec?

Tohle znáš? http://delphi.cz/post/DDDebug.aspx
Embarcadero MVP - Czech republic

Offline wajco

  • Nováček
  • *
  • Příspěvků: 33
  • Karma: 1
    • Verze Delphi: XE6
Re:firedac problem s pamatou
« Odpověď #14 kdy: 08-12-2015, 11:18:00 »
A jen pro zajímavost: kdyz das misto * nejaky konkretni sloupec?

Tohle znáš? http://delphi.cz/post/DDDebug.aspx

nad jednym stlpcom stupa pamat tiez, ale samozrejme pomalsie. mrknem na ten debugger