Table of Contents

Freigabe von Entitys und Attributen im Cache

Informationen

  • Kategorien: Kernel | Klassenformeln
  • Version: Developer.12501
  • Veröffentlichungsdatum: Montag, 22. Juli 2019
  • Entwickler: Fischer
  • Benötigt Datenbankänderung: Nein
  • Betreff: Cache MakeStub Workset

Beschreibung

Falls Entitys nicht mehr benötigt werden, sollten sie wieder aus dem Speicher entfernt (freigegeben) werden.

Für den Projektentwickler stehen zwei Werkzeuge zur Verfügung, um die Freigabe von Entitys auszulösen:

  • Funktion „MakeStub“
  • Worksets

MakeStub wird in Klassenformeln explizit aufgerufen. Die Funktion gibt jedes übergebene Entity frei, falls es sich im Zustand „Clean“ befindet.

Worksets automatisieren diesen Vorgang: Worksets führen Buch über geladene Entitys und können diese wieder freigeben. Solange ein Workset aktiv ist, merkt es sich alle neu geladenen Entitys. Wird das Workset gelöscht, gibt es alle gemerkten Entitys wieder frei. Falls eine Klassenformel an einer Stelle Entitys einliest, die nur hier benötigt werden, kann für diese Stelle ein neues Workset definiert und aktiviert werden, welches danach automatisch wieder gelöscht wird.

Intern wird die Menge der Worksets als Stapel (Prinzip LIFO, „last in, first out“) verwaltet. Neue Worksets werden auf den Stapel gelegt und beim Löschen wieder vom Stapel entfernt. Das oben auf dem Stapel liegende Workset ist immer das aktive Workset.

Bitte beachten: Es gibt einen Schalter zum Freigeben von Worksets: ...\system\config\settings.ini mit [WORKSET] ENABLED=TRUE

In der Developer-Version sind Worksets standardmäßig gesperrt, d.h. falls der Eintrag in settings.ini ist nicht vorhanden ist. Sie müssen vor der Verwendung in einem Projekt erst freigeschalten werden. Sobald Worksets in die EarlyAdopter- oder Release-Version übernommen wurden, sind sie standardmäßig freigeschalten, können über den Schalter jedoch gesperrt werden.

Spracherweiterung: Die Programmiersprache der Klassenformeln wurde erweitert und unterstützt jetzt Worksets Die Definition eines Workset hat die Form

workset <optional name> statement

Üblicherweise ist statement ein Block-Statement.

workset DeterminBestEquipment
{
	LoadEntitys(….);
	LoadEntitys(….);
}

Beim Ablauf der Klassenformel wird vor der Ausführung von statement ein neues Workset erzeugt, danach wird es wieder gelöscht. Dadurch werden die durch statement geladenen Entitys wieder freigegeben.

In bestimmten Fällen kann das kurzzeitige Aktivieren des vorherigen Worksets erwünscht sein ohne das aktuelle Workset zu beenden. Dazu dient die parent_workset-Anweisung.

parent_workset statement

parent_workset nimmt für die Dauer des folgenden statements das aktive Workset vom Stapel ohne es zu löschen. Dadurch wird das vorherige Workset wieder aktiv.

„workset“- und „parent_workset“-Anweisungen können beliebig ineinander verschachtelt werden.

Achtung: Falls es kein vorheriges Workset gibt, kann die „parent_workset“-Anweisung nicht durchge-führt werden und löst zur Laufzeit eine Ausnahme aus.

Dokumente

DO_Workset_220719_200001

Beispielcode

function void DoSomething()
{
	var entity $e1, $e2, $e3;
	var int $iLength;
 
 	LoadEntities ….; // -> Workset „A“
 
	workset B
	{	
 		LoadEntities ….; // -> Workset „B“
 
		parent_workset
		{
 			$e1 = LoadEntity … // -> Workset „A“
 			$e2 = LoadEntity … // -> Workset „A“
		} 

		$e3 = LoadEntity … // -> Workset „B“

 		MakeStub($e2); // explizit in Zustand „Stub“ überführen
 	} 
	
	$iLength = $e1.Length; // liegt im noch existierenden Workset „A“ und ist weiterhin gecached
	$iLength = $e2.Length; // wurde explizit in Zustand „Stub“ überführt -> Datenbankzugriff
	$iLength = $e3.Length; // lag in Workset „B“ und wurde implizit in Zustand „Stub“ gebracht -> Datenbankzugriff
}