Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.158 Beiträge
 
Delphi 12 Athens
 
#25

AW: Client-Units für JSON-REST-Services erzeugen

  Alt 25. Aug 2020, 16:14
Standardmäßig nein,
außer es wurde extra eingebaut/aktiviert.

Entweder das REST-Framework merkt sich die reinkommenden Parameter und das Ergebnis und bei Gleichheit wird ohne Aufruf Methode direkt das Ergebnis ausgeliefert.
Aber wenn, dann wirst du das erst explizit aktivieren müssen, denn Funktionen alla "gib mit den aktuellen Wert/Summe/Zeit/..." sollen ja nicht immer das selbe Ergebnis liefern.

Im DataSnap / RAD-Server gibt es auch einen Cache im Protokoll.
So können Parameter/Daten vor Aufruf der Methode (vor dem Request) dort reingeladen werden, der es könnte das Result dort abgelegt werden (vor allem wenn viele Date/Werte raus kommen und das nur teilweise, unsortiert oder verzögert vom Client abgerfen wird)
und wenn die Daten schon im Cache sind, dann könnte der nächste Aufruf das vorher prüfen und dann seine Arbeit abbrechen.
Ich weiß aber nicht wie man diese Funktion nutzen kann. (hab's erst vor Kurzem bemerkt, als ich es im Protokollaufbau sah)

Du kannst auch in deine Funktion sowas einbauen.
Zu Beginn in einen Cache schauen und wenn möglich dann den Rest der Methode überspringen.

Delphi-Quellcode:
var Cache: TStringList; // möglichst Sorted=True oder ein sortiertes/inditiertes TDictory<T>

funktion TMyServerMethods.MyMethod(Param: string): string;
begin
  //if Param = '' then
  // Exit('');
  Result := Cache.Values[Param];
  if Reuslt <> 'then
    Exit;

  ...

  Cache.Values[Param] := Result;
end;
Und falls Result auch ein LeerString sein kann und der Cache sowas nicht speichern kann,
dann muß man entweder damit Leben, dass die Methode in diesem Fall dennoch ausgeführt wird,
oder man muß das Speichern/Auslesen bissl anpassen.
Delphi-Quellcode:
funktion TMyServerMethods.MyMethod(Param: string): string;
begin
  Result := Cache.Values[Param];
  if Reuslt <> 'then begin
    if Reuslt = ' then
      Reuslt := '':
    Exit;
  end;

  ...

  if Result = 'then
    Result := ' ';
  Cache.Values[Param] := Result;
end;
Delphi-Quellcode:
funktion TMyServerMethods.MyMethod(Param: string): string;
begin
  i := Cache.IndexOfName(Param);
  if i >= 0 then
    Exit(Cache.ValuesByIndex[i]);

  ...

  if Result = 'then begin
    Cache.Values[Param] := '';
    Cache.Add(Param + Cache.NameValueSeparator);
  end else
    Cache.Values[Param] := Result;
end;

Etwas problematisch sind auch Fälle, wo der Request etwas dauert und mehrmals zeitgleich gleiche Anfragen rein kommen...
Entweder man baut eine Synchronisierung ein (CriticalSection) oder selbst mit Cache sind die ersten Anfragen (auch nochmal nachdem der "alte" Wert aus dem Cache flog) somit gleichzeitig, da zu Beginn noch nichts im Cache war und es wird paralell mehrfach verarbeitet würde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Aug 2020 um 16:18 Uhr)
  Mit Zitat antworten Zitat