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

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

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

Сообщение mdimich » 07.12.2007 17:17:04

В общем, не долго было мое счастье, после победы над юникодом. Теперь куда-то утекает память. Вот примерчик. для демонстрации сего нехорошего поведения:
Код: Выделить всё
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

Или это все тот же юникод жить не дает, или я что-то не так делаю...
mdimich
новенький
 
Сообщения: 29
Зарегистрирован: 03.12.2007 11:24:03

Сообщение Alexey_Melky » 20.12.2007 14:30:37

Нужно вызвать метод Free для всех размещенных экземпляров OraConn, OraTrans и OraQuery.
Alexey_Melky
новенький
 
Сообщения: 21
Зарегистрирован: 14.05.2005 14:55:31

Сообщение mdimich » 20.12.2007 16:47:14

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

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

Так что вопрос открыт.
mdimich
новенький
 
Сообщения: 29
Зарегистрирован: 03.12.2007 11:24:03


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru
cron