Утечки памяти в TSqlQuery?

Модератор: Модераторы

Ответить
mdimich
новенький
Сообщения: 29
Зарегистрирован: 03.12.2007 10:24:03

Утечки памяти в TSqlQuery?

Сообщение mdimich »

В общем, не долго было мое счастье, после победы над юникодом. Теперь куда-то утекает память. Вот примерчик. для демонстрации сего нехорошего поведения:

Код: Выделить всё

Program Test;
uses
  sqldb, oracleconnection,
  sysutils;

var
  OraConn : TOracleConnection;
  OraTrans : TSQLTransaction;
  OraQuery : TSQLQuery;
  i : integer;
begin
  OraConn := TOracleConnection.Create (nil);
  with OraConn do begin
    DatabaseName := 'mybase';
    UserName := 'user';
    Password := 'pass';
    HostName := '192.168.1.1';
    Open;
  end;
  OraTrans := TSQLTransaction.Create (nil);
  OraTrans.DataBase := OraConn;

  OraQuery := TSQLQuery.Create (nil);
  OraQuery.DataBase := OraConn;
  OraQuery.Transaction := OraTrans;

  OraQuery.Sql.Clear;
  OraQuery.Sql.Add ('insert into gkx.aaa (a1, a2, a3) ');
  OraQuery.Sql.Add ('values (:A, :B, :C)');

  for i := 1 to 10000 do begin
    OraQuery.Params.ParamByName ('A').AsInteger := 1;
    OraQuery.Params.ParamByName ('B').AsString := 'bla-bla-bla';
    OraQuery.Params.ParamByName ('C').AsDateTime := Now;
    OraQuery.ExecSql;
  end;

  readln;
end.


В результате таких, достаточно безобидных действий, внутри цикла кушается более 100мбайт. Причем, если строковый параметр исключить, то все нормально.

Причем утечки все равно есть, даже если использовать oracleconnection.pp без моего "патча" из топика http://freepascal.ru/forum/viewtopic.php?t=2941

Или это все тот же юникод жить не дает, или я что-то не так делаю...
Alexey_Melky
новенький
Сообщения: 21
Зарегистрирован: 14.05.2005 14:55:31

Сообщение Alexey_Melky »

Нужно вызвать метод Free для всех размещенных экземпляров OraConn, OraTrans и OraQuery.
mdimich
новенький
Сообщения: 29
Зарегистрирован: 03.12.2007 10:24:03

Сообщение mdimich »

Alexey_Melky, вы меня не поняли.
Память кушается именно в цикле. Конкретнее, при вызове OraQuery.Params.ParamByName ('B').AsString := 'bla-bla-bla';
Таким образом, если передать один и тот же параметр в Query несколько раз, то каждый раз выделяется память, и никуда не освобождается. Так что Free для query, oraconn и oratrans тут ни при чем.

С этой траблой я так и не разобрался, понял лишь одно, что OraQuery тут не виновата. Виноват все тот же многострадальный OracleConnection. Но внутри, я так криминала не нашел. Сделал пока запросы без bind-переменных, но это явно не кошерно.

Так что вопрос открыт.
Ответить