Приложение скомпилировано для 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.
Также, в приложении был оставлен только коннект, (все что связано с запросом было удалено) - результат тот же, непрерывная утечка памяти и непрерывный PageFault.
Также изменили БД, выполнили коннект к Oracle XE 64 bit - результат тот же, непрерывная утечка памяти и непрерывный PageFault.
Прошу прокомментировать данную ситуацию.