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.