Page 1 of 1

TOraSession утечка памяти

Posted: Thu 26 Sep 2019 07:13
by cangaroo
Добрый день.
Приложение скомпилировано для Target Platforms - Win64 на Delphi XE10 Seattle Professional, используется Devart ODAC 9.7.26 for Delphi 10, в приложении происходит коннект к БД ORACLE (Oracle Database 12c Release 12.1.0.1.0 - 64bit Production; CORE 12.1.0.1.0 Production; TNS for 64-bit Windows: Version 12.1.0.1.0 - Production; NLSRTL Version 12.1.0.1.0 - Production) примерно 4 раза в секунду. При этом наблюдается непрерывный рост потребляемой памяти, а также непрерывный PageFault (Столбцы "Память" и "Ошибки страниц" в Диспетчере задач Windows). Приложение запускалось в среде Windows 7 64 Профессиональная Servise Pack 1 и Windows Server 2008 R2 Enterprise Servise Pack 1 (64 bit)
Исходник приложения ниже:

Code: Select all

unit form_main;

interface

uses
  Winapi.Windows,
  System.SysUtils, System.Classes,
  Vcl.Controls, Vcl.Forms, Vcl.StdCtrls,
  Ora, OraCall;

type
  Tfrm_main = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    FOraSession1: TOraSession;
    FOraQuery1: TOraQuery;
    FDoStop: boolean;
  public
    { Public declarations }
  end;

var
  frm_main: Tfrm_main;

implementation

{$R *.dfm}

procedure Tfrm_main.FormCreate(Sender: TObject);
const
    qr = 'select * from ddaoutput order by id';
begin
  FDoStop:= False;

  FOraSession1:= TOraSession.Create(nil);
  FOraSession1.ThreadSafety:=   True;
  FOraSession1.ConnectPrompt:=  False;
  FOraSession1.Options.Direct:= True;
  FOraSession1.Options.UseUnicode:= True;
  FOraSession1.ConnectString:= 'testuser/[email protected]:1521:xe';

  FOraQuery1:= TOraQuery.Create(nil);
  FOraQuery1.SQL.Clear;
  FOraQuery1.SQL.Text:= qr;
end;

procedure Tfrm_main.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FOraSession1.Free;
  FOraQuery1.Free;
end;

procedure Tfrm_main.Button1Click(Sender: TObject);
begin
  while True do
  begin
    try
      FOraSession1.Connect;

      FOraQuery1.Session:= FOraSession1;
      FOraQuery1.Open;

      Application.ProcessMessages;
    finally
      FOraQuery1.Close;
      FOraSession1.Disconnect;
      sleep(250);
    end;
  end;
end;

end.
Также, данное приложение было скомпилировано с Devart ODAC 11.0.1 Trial for Delphi 10 - результат тот же, непрерывная утечка памяти и непрерывный PageFault.
Также, в приложении был оставлен только коннект, (все что связано с запросом было удалено) - результат тот же, непрерывная утечка памяти и непрерывный PageFault.
Также изменили БД, выполнили коннект к Oracle XE 64 bit - результат тот же, непрерывная утечка памяти и непрерывный PageFault.
Прошу прокомментировать данную ситуацию.

Re: TOraSession утечка памяти

Posted: Fri 27 Sep 2019 13:43
by ViktorV
Thank you for the information. We will investigate this UniDAC behavior and let you know the result.
Note that we have a Russian version of our forum where you can ask your questions in ru

Re: TOraSession утечка памяти

Posted: Mon 30 Sep 2019 09:32
by cangaroo
Thanks for the answer.
I will ask a question in the Russian-language forum.
But why UniDAC? My Question is about the ODAC...

Re: TOraSession утечка памяти

Posted: Mon 30 Sep 2019 09:38
by ViktorV
Sorry for the inaccuracy in the previous post. I meant ODAC.

Re: TOraSession утечка памяти

Posted: Thu 03 Oct 2019 12:26
by MaximG
We've reproduced the issue and fixed it. The fix will be included in the next build of our product. As a temporary solution, we'll send you the download link for the nightly build of ODAC with the latest changes. For this, please specify your license number and the exact version of Delphi you are using via the e-support form (https://www.devart.com/company/contactform.html)