В настоящее время я проектирую сервер отдыха Datasnap с Delphi. Но у меня серьезные утечки памяти.Delphi XE8: Утечка памяти с помощью сервера данных datasnap
Например, мой метод станция
procedure TV1.station(ID: integer);
begin
GetInvocationMetadata().ResponseContent := Manager.xxxxxxAPI.GetObjectStation(ID);
GetInvocationMetadata().CloseSession := true;
end;
Что называют эту функцию:
function TSmmAPI.GetObjectStation(const ID: integer) : string;
(...)
jsonObject := TJSONObject.Create;
stationSelected := xxxxxManager.WorkShops.GetStation(CNCHandle);
with StatesDB.QueryGetCurrentState(stationSelected.Handle) do begin
if RecordCount <> 0 then begin
ConvertFileToPcom(stationSelected.Ini.FileName, Pcom);
jsonObject.AddPair(TJSONPair.Create('ID', inttostr(ID)));
jsonObject.AddPair(TJSONPair.Create('Name', FieldByName(sbStaStationField).AsString));
jsonObject.AddPair(TJSONPair.Create('Workshop', stationSelected.Shop.Name));
jsonObject.AddPair(TJSONPair.Create('Group', Pcom.Others.GroupName));
jsonObject.AddPair(TJSONPair.Create('CurrentRef', FieldByName(sbStaRefNameField).AsString));
jsonObject.AddPair(TJSONPair.Create('CurrentState', FieldByName(sbStaStateField).AsString));
jsonObject.AddPair(TJSONPair.Create('Job', FieldByName(sbStaOPNameField).AsString));
jsonObject.AddPair(TJSONPair.Create('Order',FieldByName(sbStaOFNameField).AsString));
//(...), I have 12 addpair.
Disconnect;
end;
Destroy;
end;// with StatesDB.QueryGetCurrentState
result := jsonobject.toString;
jsonObject.FreeInstance;
end;
Вы можете видеть, я использую resultContent вместо результата из функции, потому что я не хочу результат: в моем ответе json.
Итак, с сообщением от ReportMemoryLeaksOnShutdown, я вижу, что все мои jsonObject и каждый jsonpair не уничтожаются !!!
Result leak memory report, 5501 request from my client application
LifeCycle из класса сервера: Session
Я использую DSRESTWebDispatcher, установленный в Session Цикла и Timout на 60000.
Кто-то есть объяснение? Забыл ли я что-нибудь сделать?
Да это работает, спасибо! – Stackier