SessionHandle-Integration

Ein SessionHandle-Objekt enthält die Partitionsinformationen für die Sitzung, an die das Objekt gebunden ist, und vereinfacht das Anforderungsrouting. SessionHandle-Objekte gelten nur für das containerbezogene Partitionsverteilungsszenario.

SessionHandle-Objekt für Anforderungsrouting

Sie können ein SessionHandle-Objekt wie folgt an eine Sitzung binden:

Tipp: In jedem der folgenden Methodenaufrufe kann das SessionHandle-Objekt, nachdem es an eine Sitzung gebunden wurde, mit der Methode Session.getSessionHandle abgerufen werden.
  • Methode Session.getSessionHandle aufrufen: Wenn diese Methode aufgerufen wird und kein SessionHandle-Objekt an das Session-Objekt gebunden ist, wird ein SessionHandle-Objekt zufällig ausgewählt und an das Session-Objekt gebunden.
  • CRUD-Operationen aufrufen: Wenn CRUD-Operationen (Create (Erstellen, Retrieve (Abrufen), Update (Aktualisieren) und Delete (Löschen) zur Festschreibungszeit aufgerufen werden und kein SessionHandle-Objekt an das Session-Objekt gebunden ist, wird ein SessionHandle-Objekt zufällig ausgewählt und an das Session-Objekt gebunden.
  • Methode ObjectMap.getNextKey aufrufen: Wenn diese Methode aufgerufen wird und kein SessionHandle-Objekt an das Session-Objekt gebunden ist, wird die Operationsanforderung nach dem Zufallsprinzip an einzelne Partitionen weitergeleitet, bis ein Schlüssel zurückgegeben wird. Wird ein Schlüssel von einer Partition zurückgegeben, wird ein SessionHandle-Objekt, das dieser Partition entspricht, an das Session-Objekt gebunden. Wird kein Schlüssel gefunden, wird kein SessionHandle-Objekt an das Session-Objekt gebunden.
  • Methode QueryQueue.getNextEntity oder QueryQueue.getNextEntities aufrufen: Wenn diese Methode aufgerufen wird und kein SessionHandle-Objekt an das Session-Objekt gebunden ist, wird die Operationsanforderung nach dem Zufallsprinzip an einzelne Partition weitergeleitet, bis ein Objekt zurückgegeben wird. Wird ein Objekt von einer Partition zurückgegeben, wird ein SessionHandle-Objekt, das dieser Partition entspricht, an das Session-Objekt gebunden. Wird kein Objekt gefunden, wird kein SessionHandle-Objekt an das Session-Objekt gebunden.
  • SessionHandle-Objekt mit der Methode Session.setSessionHandle(SessionHandle sh) definieren: Wenn ein SessionHandle-Objekt mit der Methode Session.getSessionHandle abgerufen wird, kann das SessionHandle-Objekt an ein Session-Objekt gebunden werden. Die Definition eines SessionHandle-Objekts beeinflusst das Anforderungsrouting im Geltungsbereich der Sitzung, an die das SessionHandle gebunden wird.

Die Methode Session.getSessionHandle gibt immer ein SessionHandle-Objekt zurück. Außerdem bindet die Methode automatisch ein SessionHandle-Objekt an das Session-Objekt, wenn kein SessionHandle-Objekt an das Session-Objekt gebunden ist. Wenn Sie nur prüfen möchten, ob eine Sitzung ein SessionHandle-Objekt hat, rufen Sie die Methode Session.isSessionHandleSet auf. Gibt diese Methode den Wert false zurück, ist derzeit kein SessionHandle-Objekt an die Sitzung gebunden.

Wichtige Operationstypen im containerbezogenen Verteilungsszenario

Im Folgenden finden Sie eine Zusammenfassung des Routingverhaltens wichtiger Operationstypen im containerbezogenen Verteilungsszenario im Hinblick auf SessionHandle-Objekte.

  • Session-Objekt mit gebundenem SessionHandle-Objekt
    • Index - APIs MapIndex und MapRangeIndex: SessionHandle
    • Query und ObjectQuery: SessionHandle
    • Agent - APIs MapGridAgent und ReduceGridAgent: SessionHandle
    • ObjectMap.Clear: SessionHandle
    • ObjectMap.getNextKey: SessionHandle
    • QueryQueue.getNextEntity, QueryQueue.getNextEntities: SessionHandle
    • Transaktionsorientierte CRUD-Operationen (Create, Retrieve, Update, und Delete), (APIs ObjectMap und EntityManager): SessionHandle
  • Session-Objekt ohne gebundenes SessionHandle-Objekt
    • Index - APIs MapIndex und MapRangeIndex: Alle derzeit aktiven Partitionen
    • Query und ObjectQuery: Angegebene Partition mit der Methode "setPartition" von Query und ObjectQuery
    • Agent - MapGridAgent und ReduceGridAgent
      • Nicht unterstützt: Methoden "ReduceGridAgent.reduce(Session s, ObjectMap map, Collection keys)" und "MapGridAgent.process(Session s, ObjectMap map, Object key)"
      • Alle derzeit aktiven Partitionen: Methoden "ReduceGridAgent.reduce(Session s, ObjectMap map)" und "MapGridAgent.processAllEntries(Session s, ObjectMap map)"
    • ObjectMap.clear: Alle derzeit aktiven Partitionen
    • ObjectMap.getNextKey: Bindet ein SessionHandle-Objekt an die Sitzung, wenn eine der zufällig ausgewählten Partitionen einen Schlüssel zurückgibt. Wird kein Schlüssel zurückgegeben, wird kein SessionHandle-Objekt an die Sitzung gebunden.
    • QueryQueue: Gibt eine Partition mit der Methode "QueryQueue.setPartition" an. Ist keine Partition definiert, wählt die Methode eine Partition zufällig für die Rückgabe aus. Wenn ein Objekt zurückgegeben wird, wird das aktuelle Session-Objekt mit dem SessionHandle-Objekt gebunden, das an die Partition gebunden ist, die das Objekt zurückgibt. Wird kein Objekt zurückgegeben, wird kein SessionHandle-Objekt an die Sitzung gebunden.
    • Transaktionsorientierte CRUD-Operationen (Create, Retrieve, Update, und Delete), (APIs ObjectMap und EntityManager): Zufällige Auswahl einer Partition

    In den meisten Fällen verwenden Sie SessionHandle, um das Routing an eine bestimmte Partition zu steuern. Sie können das SessionHandle-Objekt von der Sitzung, die Daten einfügt, abrufen und zwischenspeichern. Nach dem Zwischenspeichern des SessionHandle-Objekts können Sie es in einer anderen Sitzung definieren, um Anforderungen an die im zwischengespeicherten SessionHandle-Objekt angegebene Partition weiterzuleiten. Zum Ausführen von Operationen wie ObjectMap.clear ohne SessionHandle können Sie das SessionHandle-Objekt vorübergehend auf null setzen, indem Sie Session.setSessionHandle(null) aufrufen. Ohne ein angegebenes SessionHandle-Objekt werden Operationen in allen derzeit aktiven Partitionen ausgeführt.

  • Routingverhalten von QueryQueue

    Im containerbezogenen Partitionsverteilungsszenario können Sie das SessionHandle-Objekt verwenden, um das Routing von getNextEntity- und getNextEntities-Methoden der API "QueryQueue" zu steuern. Wenn die Sitzung an ein SessionHandle-Objekt gebunden ist, werden Anforderungen an die Partition weitergeleitet, an die das SessionHandle-Objekt gebunden ist. Ist die Sitzung nicht an ein SessionHandle-Objekt gebunden, werden Anforderungen an die mit der Methode "QueryQueue.setPartition" definierten Partition weitergeleitet, sofern eine Partition auf diese Weise definiert wurde. Wenn die Sitzung kein gebundenes SessionHandle-Objekt bzw. keine gebundene Partition hat, wird eine zufällig ausgewählte Partition zurückgegeben. Wird eine solche Partition nicht gefunden, wird der Prozess gestoppt und kein SessionHandle-Objekt an die aktuelle Sitzung gebunden.

Das folgende Code-Snippet veranschaulicht die Verwendung von SessionHandle-Objekten.

Session ogSession = objectGrid.getSession();

// SessionHandle-Objekt binden
SessionHandle sessionHandle = ogSession.getSessionHandle();

ogSession.begin();
ObjectMap map = ogSession.getMap("planet");
map.insert("planet1", "mercury");

// Transaktion wird an die vom SessionHandle-Objekt angegebene Partition weitergeleitet
ogSession.commit();
// SessionHandle, das Daten einfügt, zwischenspeichern
SessionHandle cachedSessionHandle = ogSession.getSessionHandle();

// Prüfen, ob SessionHandle in der Sitzung definiert ist
boolean isSessionHandleSet = ogSession.isSessionHandleSet();

// Bindung des SessionHandle zur Sitzung vorübergebend aufheben
if(isSessionHandleSet) {
    ogSession.setSessionHandle(null);
} 

// Wenn die Sitzung kein gebundenes SessionHandle hat, wird die
// Operation clear in allen derzeit aktiven Partitionen ausgeführt,
// woraufhin alle Daten aus der Map im gesamten Grid entfernt werden.
map.clear();

// Nach Abschluss der Operation clear das SessionHandle zurücksetzen, wenn
// die Sitzung das vorherige SessionHandle verwenden muss.
// Optional kann durch Aufruf von getSessionHandle ein neues SessionHandle
// abgerufen werden.
ogSession.setSessionHandle(cachedSessionHandle);

Hinweise zum Anwendungsdesign

Im Szenario mit containerbezogener Verteilungsstrategie verwenden Sie das SessionHandle-Objekt für die meisten Operationen verwenden. Das SessionHandle-Objekt steuert das Routing an Partitionen. Zu Abrufen von Daten muss das SessionHandle-Objekt, das Sie an die Sitzung binden, das SessionHandle-Objekt aller Transaktionen zum Einfügen von Daten sein.

Wenn Sie eine Operation ohne ein in der Sitzung definiertes SessionHandle-Objekt ausführen möchten, können Sie die Bindung des SessionHandle-Objekts zur Sitzung aufheben, indem Sie den Methodenaufruf Session.setSessionHandle(null) absetzen.

Wenn eine Sitzung an ein SessionHandle-Objekt gebunden ist, werden alle Operationsanforderungen an die im SessionHandle-Objekt angegebene Partition weitergeleitet. Ohne definiertes SessionHandle-Objekt werden Operationen an alle Partitionen bzw. an eine zufällig ausgewählte Partition weitergeleitet.