Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Постоянная утечка памяти


Автор: Ace Wentura 26.4.2005, 09:58
Происходит буквально следующее. Есть метод. К нему обращаясь передают параметры. Эти параметры забиваются сначала в TpFIBDataSet, его активизирую и получаю результат.
По итогам создаю SQL-запрос и пихаю его в TpFIBQuery. Аналогично активизирую и получаю результат.
Так вот, после выполнения запросов каждый раз сжирается некая память. Всё бы ничего, да она ещё и не очищается. Но это тоже не проблема. Проблема в том, что после 20000 раз (а это ещё не предел) системе перестаёт хватать памяти даже виртуальной.
Как с этим бороться?

Автор: Петрович 26.4.2005, 11:16
Ошибка в 17-й строке.

Автор: Ace Wentura 26.4.2005, 11:24
А что это означает?

Автор: fess 26.4.2005, 11:40
Это означает, что неплохо бы выложить код для просмотра, а то телепатических способностей не хватает для диагностики ошибки smile

Автор: Ace Wentura 26.4.2005, 11:47
Извиняюсь. Я просто подумал, что это какая-то стандартная ошибка типа: забыл сделать free. Или ещё что в этом роде.

Вот код.
Код

function TDM.GetValue(Key: String; ID: Integer): String;
var
  sql: string;
begin

  if (Key<>'5')then
  begin
    pFIBDSFields.Active := False;
    pFIBDSFields.ParamByName('Param_Rus').AsString := Key;
    pFIBDSFields.Active := True;

    if (not pFIBDSFields.Eof) then
    begin
      if Key='4' then
        sql := 'SELECT ... ;'
      else
        if ((Key='1') or (Key='2') or (Key='3')) then
          sql := 'SELECT ...;'
        else
          sql := 'SELECT ...;';
      pFIBQuery.Close;
      pFIBQuery.SQL.Clear;
      pFIBQuery.SQL.Add(sql);
      pFIBQuery.ExecQuery;

      if (not pFIBQuery.Eof) then
      begin
        if (pFIBQuery.Fields[0].AsString='') then
          Result := '-'
        else
          Result := trim(pFIBQuery.Fields[0].AsString);
      end
      else
        Result := '-';
    end
    else
      Result := '-';
  end
  else
  begin
    Result := GetIO(ID);
  end;
end;


Запросы SQL сократил, но они работают точно.

Автор: Ace Wentura 27.4.2005, 12:20
Всё, багу поправил.
Дело было не в запросах и не в компонентах работы с БД, а в том, что не чистиллись корректно списки.

Но всё-таки интересно, сказывается ли как-нибудь на объёме используемой оперативки то, вызываю ли я принудительно Transaction.commit(rollback) или не вызываю (как у меня)?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)