Lade...
 

CX_DB_UTILITY::MoveFrame

CX_DB_UTILITY::MoveFrame

213694
Beschreibung:

Diese Methode führt für jedes übergebene (persistente) Objekt in der Collection eine Reallokation des Frames (die Slots) durch. Dabei wird das Slot-Array mit dem neuen Cluster-Switching-Mechanismus im Cluster des Objekts allokiert, sodass das Slot-Array nur dann im gleichen Cluster, wie das Objekt selbst allokiert wird, wenn der Cluster das Limit für die Default-Allokation nicht überschreitet. 

Zusammen mit CX_OBJECT_MANAGER։։CollectInSegment können so alte, stark überfüllte Cluster sicher entleert werden, indem die Frames der Objekte in andere Cluster verschoben werden. Die Slots werden dabei nicht gelöscht, sondern 1:1 im anderen Cluster wieder aufgebaut. Im regulären ClassiX-Betrieb ist eine solche Operation nicht notwendig. Für alte 32-Bit Datenbanken, die lange ohne Segment-Splitting liefen und deren Default-Cluster am Limit sind, kann das die einzige Möglichkeit sein, um diese Cluster ausreichend zu reduzieren, damit eine Evolution der Datenbank auf 64-Bit gelingen kann (32-Bit und 64-Bit haben beide leider das gleiche Größenlimit für Cluster). 

Gerade weil diese Methode für das Aufräumen von 32-Bit Datenbanken vorgesehen ist, führt sie korrektes Address-Space-Overflow-Handling durch und arbeitet deshalb auch auf einer Collection, um möglichst viel Address-Space freigeben zu können und bei einem erneuten Versuch korrekt weiterzuarbeiten.

Die Methode erhält als zweiten Parameter die Anzahl an Objekten, die pro Transaktion verarbeitet werden sollen, denn unter 32-Bit wird der verfügbare Address-Space vermutlich nicht ausreichen, um in einer einzigen Transaktion alle Objekte eines Clusters anzufassen. Wird 0 angegeben, dann werden alle Objekte in einer einzigen Transaktion verschoben. 

Hinweis: Hierbei sollte beachtet werden, dass bei zu vielen Objekten pro Transaktion oder bei insgesamt zu vielen Objekten, die verschoben werden sollen, der Prozess mit einem Address-Space-Overflow Fehler abbrechen kann. Falls nicht die erste Transaktion abbricht, dann wurde MoveFrame aber bereits erfolgreich auf einige Elemente aus der Collection durchgeführt und die Operation nochmals für die gesamte Collection auszuführen wäre zwar nicht schädlich, wäre aber doppelter Aufwand und führt womöglich dazu, dass der nächste Versuch wieder einen Address-Space-Overflow erhält. 
Dieses Problem lässt sich durch die Verwendung von MoveFrameBatch umgehen, welches darauf ausgelegt ist, eine Operation fortsetzen zu können.

Die Methode öffnet ein Fortschrittsfenster, das den aktuellen Fortschritt der Operation visualisiert.

 

Code-Beispiel:
objects 0 GetManager(OBJECT) Call(GetDBUtility) Call(MoveFrame)

 

Stack
Stack Position Objekttyp Kurzbeschreibung
Stack(In) Top CX_DB_UTILITY DB-Utility
  Top-1 INTEGER Objekte pro Transaktion
  Top-2 COLLECTION Die Objekte, deren Frames verschoben werden sollen
Stack(Out) Top - -

Funktionsaufruf: Call(MoveFrame)