Autor Téma: firedac problem s pamatou  (Přečteno 3896 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ů: 2375
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • 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ů: 2607
  • Karma: 133
    • 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ů: 4506
  • Karma: 40
    • Verze Delphi: XE7 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.
Delphi XE7, FireBird
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ů: 4506
  • Karma: 40
    • Verze Delphi: XE7 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í.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2375
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • 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ů: 2375
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • 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ů: 4506
  • Karma: 40
    • Verze Delphi: XE7 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.
Delphi XE7, FireBird
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ů: 2375
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • 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