Lade...
 

Clustering Sample

Clustering mit Lazy-Creator-Objekten

Anhand von Beispielen wird gezeigt, wie sich folgende Einstellungen im Initialisierungsfile auf das Clustering auswirken:

  • Verwendung von Seg(master, slave) in der Storage-Angabe
  • Verwendung von Cluster(1) in der Klassenbeschreibung (Class oder PseudoClass)
  • Verwendung von AUTO in der Segment-Definition des Slave-Segments

In den Beispielen wird jeweils

  1. eine Purchase-Order erzeugt (CX_PURCHASE_ORDER),
  2. zwei Positionen werden erzeugt (CX_TRANSACTION)
  3. diese werden in Purchase-Order in die member-collection "transactions" eingefügt.

Var(po, txn1, txn2)

// 1.
CreatePersObject(CX_PURCHASE_ORDER) -> po
"name" po Put(uniqueID)

// 2.
CreatePersObject(CX_TRANSACTION) -> txn1 // a Lazy-Creator is created
CreatePersObject(CX_TRANSACTION) -> txn2 // a Lazy-Creator is created

// 3.
txn1 po Link(transactions)
txn2 po Link(transactions)
 

In Schritt 2 werden automatisch CX_LAZY_CREATOR-Objekte statt CX_TRANSACTION-Objekte erzeugt. Erst in Schritt 3 werden aus den Lazy-Creator-Objekten die richtigen CX_TRANSACTION-Objekte erzeugt. Das geschieht erst an dieser Stelle,  weil erst jetzt das steuernde Master-Objekt (die Purchase-Order) für die Transaktionen bekannt ist.

Beispiel 1: Ohne Clustering-Vorgaben

PseudoClass(CX_PURCHASE_ORDER, 10544, purchaseOrder, CX_COMPOUND_TXN, Docu(25200))
File(purchaseOrder, empty, purchaseOrder)
Storage(purchaseOrder, DB(1), "purchaseOrderS", EP("purchaseOrderL0"(LIST)), EP("purchaseOrderL1"(LIST)), EP("purchaseOrderL2"(LIST)), CSeg("cs.purchaseOrder"), Garbage("geps" , "gcs"))

Class(CX_TRANSACTION, 10500, transaction, CX_EXPANDABLE, 0, Docu(21000))
File(transaction, empty, transaction)
Storage(transaction, DB(1), , EP("transactionL0"(LIST)), CSeg("cs.transaction"), Garbage("geps", "gcs"))

// Spielt keine Rolle: Segment(purchaseOrderSlaveS, DB(1), 100000000)
 

Da keine Cluster-Informationen angegeben sind, werden die Slave-Objekte im selben Segment und Cluster angelegt wie das Master-Objekt. Wenn Sie direkt hintereinander angelegt werden, landen sie wahrscheinlich auf derselben Page, auf direkt aufeinanderfolgendem Speicher.

PO: Segment 134, Cluster 0, Offset 0x210
TXN 1: Segment 134, Cluster 0, Offset 0x310
TXN 2: Segment 134, Cluster 0, Offset 0x380
 

Beispiel 2: Mit Master-/Slave-Segmentangaben (Seg)

PseudoClass(CX_PURCHASE_ORDER, 10544, purchaseOrder, CX_COMPOUND_TXN, Docu(25200))
File(purchaseOrder, empty, purchaseOrder)
Storage(purchaseOrder, DB(1), Seg("purchaseOrderS", "purchaseOrderSlaveS"), EP("purchaseOrderL0"(LIST)), EP("purchaseOrderL1"(LIST)), EP("purchaseOrderL2"(LIST)), CSeg("cs.purchaseOrder"), Garbage("geps" , "gcs"))

Class(CX_TRANSACTION, 10500, transaction, CX_EXPANDABLE, 0, Docu(21000))
File(transaction, empty, transaction)
Storage(transaction, DB(1), , EP("transactionL0"(LIST)), CSeg("cs.transaction"), Garbage("geps", "gcs"))

Segment(purchaseOrderSlaveS, DB(1), 100000000)
 

Die Master-Objekte werden ohne Clustering im Master-Segment angelegt (im Default-Cluster). Die Slave-Objekte werden im Default-Cluster des Slave-Segments angelegt, unabhängig von der Identität des Master-Objekts:

PO 1: Segment 134, Cluster 0, Offset 0x0
TXN 1: Segment 132, Cluster 0, Offset 0x0
TXN 2: Segment 132, Cluster 0, Offset 0x70
TXN 3: Segment 132, Cluster 0, Offset 0xe0

PO 2: Segment 134, Cluster 0, Offset 0x104
TXN 4: Segment 132, Cluster 0, Offset 0x150

 

Beispiel 3: Mit Master-/Slave-Segmentangaben und Cluster

PseudoClass(CX_PURCHASE_ORDER, 10544, purchaseOrder, CX_COMPOUND_TXN, Cluster(1), Docu(25200))
File(purchaseOrder, empty, purchaseOrder)
Storage(purchaseOrder, DB(1), Seg("purchaseOrderS", "purchaseOrderSlaveS"), EP("purchaseOrderL0"(LIST)), EP("purchaseOrderL1"(LIST)), EP("purchaseOrderL2"(LIST)), CSeg("cs.purchaseOrder"), Garbage("geps" , "gcs"))

Class(CX_TRANSACTION, 10500, transaction, CX_EXPANDABLE, 0, Docu(21000))
File(transaction, empty, transaction)
Storage(transaction, DB(1), , EP("transactionL0"(LIST)), CSeg("cs.transaction"), Garbage("geps", "gcs"))

Segment(purchaseOrderSlaveS, DB(1), 100000000)
 

Durch die Cluster(1)-Angabe für das Master-Objekt werden diese in jeweils einem eigenen Cluster angelegt (und damit auf einer eigenen Page). Da die Slave-Objekt durch die Seg-Angabe in ein eigenes Segment verschoben werden, sind diese nicht davon betroffen.

PO 1: Segment 134, Cluster 2, Offset 0x0
TXN 1: Segment 132, Cluster 0, Offset 0x0
TXN 2: Segment 132, Cluster 0, Offset 0x70
PO 2: Segment 134 Cluster 4, Offset 0x0
TXN 3: Segment 132, Cluster 0, Offset 0xe0
TXN 4: Segment 132, Cluster 0, Offset 0x150
 

Beispiel 4: Mit Master-/Slave-Segmentangaben und Cluster und AUTO

PseudoClass(CX_PURCHASE_ORDER, 10544, purchaseOrder, CX_COMPOUND_TXN, Cluster(1), Docu(25200))
File(purchaseOrder, empty, purchaseOrder)
Storage(purchaseOrder, DB(1), Seg("purchaseOrderS", "purchaseOrderSlaveS"), EP("purchaseOrderL0"(LIST)), EP("purchaseOrderL1"(LIST)), EP("purchaseOrderL2"(LIST)), CSeg("cs.purchaseOrder"), Garbage("geps" , "gcs"))

Class(CX_TRANSACTION, 10500, transaction, CX_EXPANDABLE, 0, Docu(21000))
File(transaction, empty, transaction)
Storage(transaction, DB(1), , EP("transactionL0"(LIST)), CSeg("cs.transaction"), Garbage("geps", "gcs"))

Segment(purchaseOrderSlaveS, DB(1), AUTO, 100000000)
 

In dieser Einstellung werden durch Cluster(1) die Master-Objekte auf ein eigenes Cluster gelegt, und die Slave-Objekte durch die AUTO-Definition des Slave-Segments in einem Slave-Segment auf einem zum Master-Objekt gehörigem Cluster gruppiert:

PO 1: Segment 134, Cluster 0, Offset 0x0
TXN 1: Segment 132, Cluster 0, Offset 0x0
TXN 2: Segment 132, Cluster 0, Offset 0x70
PO 2: Segment 134, Cluster 2, Offset 0x0
TXN 3: Segment 132, Cluster 2, Offset 0x0
TXN 4: Segment 132, Cluster 2, Offset 0x70