Die Schnittstelle "ObjectMap" wird für transaktionsorientierte Interaktionen zwischen Anwendungen und
BackingMaps verwendet.
Zweck
Eine ObjectMap-Instanz wird von einem Session-Objekt abgerufen, das dem aktuellen Thread entspricht.
Die Schnittstelle "ObjectMap" ist das wichtigste Mittel, das Anwendungen einsetzen, um Änderungen an Einträgen in einer
BackingMap vorzunehmen.
ObjectMap-Instanz abrufen
Eine Anwendung ruft eine
ObjectMap-Instanz von einem Session-Objekt über die Methode "
Session.getMap(String)" ab.
Das folgende Code-Snippet veranschaulicht, wie eine ObjectMap-Instanz abgerufen wird:
ObjectGrid objectGrid = ...;
BackingMap backingMap = objectGrid.defineMap("mapA");
Session sess = objectGrid.getSession();
ObjectMap objectMap = sess.getMap("mapA");
Jede ObjectMap-Instanz entspricht einem bestimmten Session-Objekt.
Wenn Sie die Methode "
getMap" mehrfach für ein bestimmtes Session-Objekt mit demselben BackingMap-Namen aufrufen, wird immer dieselbe
ObjectMap-Instanz zurückgegeben.
Transaktionen automatisch festschreiben
Operationen für BackingMaps, die ObjectMaps und JavaMaps verwenden,
werden am effizientesten in einer Session-Transaktion durchgeführt.
WebSphere eXtreme Scale stellt die Unterstützung für automatische Festschreibung (autocommit) bereit, wenn Methoden
in den Schnittstellen "ObjectMap" und "JavaMap" außerhalb einer Session-Transaktion aufgerufen werden. Die Methoden
starten eine implizite Transaktion, führen die angeforderte Operation durch und schreiben die implizite Transaktion fest.
Methodensemantik
Im Folgenden wird die Semantik
der einzelnen Methoden in den Schnittstellen "ObjectMap" und "JavaMap" erläutert.
- Methode "containsKey"
- Die Methode "containsKey" bestimmt, ob ein Schlüssel einen Wert in der BackingMap oder im Loader hat. Wenn Nullwerte
von einer Anwendung unterstützt werden, kann diese Methode verwendet werden, um zu bestimmen, ob eine Nullreferenz, die
von einer get-Operation zurückgegeben wird, auf einen Nullwert verweist oder anzeigt, dass die
BackingMap und der Loader den Schlüssel nicht enthalten.
- Methode "flush"
- Die Semantik der Methode "flush" gleicht der Semantik der Methode
"flush" in der Schnittstelle "Session".
Der nennenswerte Unterschied ist der, dass die Methode "flush" der Schnittstelle "Session"
die aktuellen offenen Änderungen für alle Maps anwendet, die in der aktuellen Sitzung geändert werden.
Diese Methode "flush" hingegen überträgt nur die Änderungen in dieser ObjectMap-Instanz an den Loader.
- Methode "get"
- Die Methode "get" ruft den Eintrag aus der BackingMap-Instanz ab.
Wenn der Eintrag nicht in der BackingMap-Instanz gefunden wird, der
BackingMap-Instanz aber ein Loader zugeordnet ist, versucht die BackingMap-Instanz, den Eintrag vom Loader abzurufen.
Die Methode "getAll" wird bereitgestellt, um den Abrufprozess im Stapelbetrieb durchzuführen.
- Methode "getForUpdate"
- Die Methode "getForUpdate" entspricht der Methode "get", aber wenn Sie die
Methode "getForUpdate" verwenden, teilen Sie der BackingMap und dem
Loader mit, dass der Eintrag aktualisiert werden soll. Ein Loader kann diesen Hinweis verwenden, um eine SELECT- oder UPDATE-Abfrage an ein Datenbank-Back-End abzusetzen.
Wenn eine pessimistische Sperrstrategie für die BackingMap definiert ist, sperrt der Sperrenmanager den Eintrag.
Die Methode "getAllForUpdate" wird bereitgestellt, um den Abrufprozess im Stapelbetrieb durchzuführen.
- Methode "insert"
- Die Methode "insert" fügt einen Eintrag in die BackingMap und in den Loader ein. Mit der Verwendung dieser Methode
teilen Sie der BackingMap und dem Loader mit, dass Sie einen Eintrag einfügen möchten, der noch nicht vorhanden ist.
Wenn Sie diese Methode für einen vorhandenen Eintrag verwenden, wird beim Aufruf der Methode bzw. beim Festschreiben
der aktuellen Transaktion eine Ausnahme ausgelöst.
- Methode "invalidate"
- Die Semantik der Methode "invalidate" ist von dem Wert des Parameters
isGlobal abhängig, der an die Methode übergeben wird.
Die Methode "invalidateAll" wird bereitgestellt, um den invalidate-Prozess im Stapelbetrieb durchzuführen.
Ein lokales Ungültigmachen wird angegeben, wenn der Wert "false" mit dem Parameter isGlobal der Methode "invalidate" übergeben wird.
Beim lokalen Ungültigmachen werden alle Änderungen am Eintrag im Transaktionscache verworfen.
Wenn die Anwendung eine Methode "get" absetzt, wird der Eintrag aus dem zuletzt festgeschriebenen Wert in der BackingMap abgerufen.
Wenn kein Eintrag in der BackingMap vorhanden ist, wird der Eintrag aus dem zuletzt mit Flush übertragenen
oder festgeschriebenen Wert im Loader abgerufen. Wenn eine Transaktion
festgeschrieben wird, haben alle Einträge mit der Markierung für lokales Ungültigmachen keine Auswirkung auf die
BackingMap. Alle Änderungen, die mit Flush an den Loader übertragen wurden, werden festgeschrieben, selbst wenn der Eintrag ungültig gemacht wurde.
Ein globales Ungültigmachen wird angegeben, wenn der Wert "true" mit dem Parameter isGlobal der Methode "invalidate" übergeben wird.
Beim globalen Ungültigmachen werden alle offenen Änderungen am Eintrag im Transaktionscache
verworfen, und der BackingMap-Wert wird bei nachfolgenden Operationen, die für den Eintrag durchgeführt wird,
umgangen.
Wenn eine Transaktion
festgeschrieben wird, werden alle Einträge mit der Markierung für globales Ungültigmachen aus der BackingMap entfernt.
Stellen Sie sich beispielsweise den folgenden Anwendungsfall für das Ungültigmachen vor:
Die BackingMap wird durch eine Datenbanktabelle gestützt, die eine Spalte für automatische Erhöhung hat.
Inkrementspalten sind hilfreichen, um Datensätzen eindeutige Nummern zuzuordnen.
Die Anwendung fügt einen Eintrag ein.
Nach dem Einfügen muss die Anwendung die Folgenummer für die eingefügte Zeile kennen.
Sie weiß, dass ihre Kopie des Objekts veraltet ist, und verwendet deshalb das globale Ungültigmachen, um den Wert
vom Loader abzurufen.
Der folgende Code demonstriert diesen Anwendungsfall:
Session sess = objectGrid.getSession();
ObjectMap map = sess.getMap("mymap");
sess.begin();
map.insert("Billy", new Person("Joe", "Bloggs", "Manhattan"));
sess.flush();
map.invalidate("Billy", true);
Person p = map.get("Billy");
System.out.println("Version column is: " + p.getVersion());
map.commit();// Close the session (optional in Version 7.1.1 and later) for improved performance
session.close();
Dieses Codebeispiel fügt einen Eintrag für Billy hinzu.
Das Attribut "version" des Person-Objekts wird über eine Spalte für automatische Erhöhung in der Datenbank gesetzt.
Die Anwendung führt zunächst einen Befehl "insert" aus.
Anschließend setzt sie einen Befehl "flush" ab, der bewirkt, dass der eingefügte Eintrag an den Loader und an die Datenbank gesendet wird.
Die Datenbank setzt die Spalte "version" auf die nächste Nummer in der Folge, woraufhin das
Person-Objekt in der Transaktion veraltet ist.
Zum Aktualisieren des Objekts wird die Anwendung global ungültig gemacht.
Die nächste Methode "get", die abgesetzt wird, ruft den Eintrag
vom Loader ab und ignoriert dabei den Transaktionswert. Der Eintrag wird aus der Datenbank mit dem aktualisierten
Versionswert abgerufen.
- Methode "put"
- Die Semantik der Methode "put" ist davon abhängig, ob zuvor eine Methode
"get" in der Transaktion für den Schlüssel aufgerufen wurde.
Wenn die Anwendung eine Operation "get" absetzt, die einen Eintrag zurückgibt, der in der BackingMap oder im
Loader vorhanden ist, wird die Methode "put" als Aktualisierung interpretiert und gibt den vorherigen
Wert in der Transaktion zurück.
Wenn ein Aufruf der Methode "put" ohne vorherigen Aufruf der Methode
"get" durchgeführt wird oder wenn bei einem vorherigen Aufruf der Methode
"get" kein Eintrag gefunden wurde, wird die Operation als Einfügeoperation interpretiert.
Die Semantik der Methoden "insert" und "update"
kommt zur Anwendung, wenn die Operation "put" festgeschrieben wird.
Die Methode "putAll" wird zur Unterstützung von Einfüge- und Aktualisierungsoperationen im Stapelbetrieb
bereitgestellt.
- Methode "remove"
- Die Methode "remove" entfernt den Eintrag aus der
BackingMap und aus dem Loader, wenn ein Loader integriert ist. Der Wert
des Objekts, das entfernt wurde, wird von dieser Methode zurückgegeben. Wenn das Objekt nicht vorhanden ist,
gibt diese Methode einen Nullwert zurück.
Die Methode "removeAll" wird zur Unterstützung von Löschoperationen im Stapelbetrieb
ohne Rückgabewerte bereitgestellt.
- Methode "setCopyMode"
- Die Methode "setCopyMode" gibt einen CopyMode-Wert für diese ObjectMap an.
Mit dieser Methode kann eine Anwendung den CopyMode-Wert überschreiben, der in der BackingMap definiert ist.
Der angegebene CopyMode-Wert bleibt so lange wirksam, bis die Methode "clearCopyMode" aufgerufen wird.
Beide Methoden können außerhalb der Transaktionsgrenzen aufgerufen werden.
Ein CopyMode-Wert kann nicht mitten in einer Transaktion geändert werden.
- Methode "touch"
- Die Methode "touch" aktualisiert die letzte Zugriffszeit für einen Eintrag.
Diese Methode ruft den Wert nicht aus der BackingMap ab.
Verwenden Sie diese Methode in einer eigenen Transaktion. Wenn der bereitgestellte Schlüssel nicht in der BackingMap vorhanden ist, weil
er ungültig gemacht oder entfernt wurde, wird während der Festschreibung eine Ausnahme ausgelöst.
- Methode "update"
- Die Methode "update" aktualisiert explizit einen Eintrag in der
BackingMap und im Loader. Die Verwendung dieser Methode zeigt der
BackingMap und dem Loader an, dass Sie einen vorhandenen Eintrag aktualisieren möchten. Beim Aufruf der Methode bzw. bei der Festschreibung
wird eine Ausnahme ausgelöst, wenn Sie die Methode für einen Eintrag aufrufen, der nicht vorhanden ist.
- Methode "getIndex"
- Die Methode "getIndex" versucht, einen benannten Index abzurufen, der für die
BackingMap erstellt wurde. Der Index kann nicht von mehreren Threads gemeinsam genutzt werden und funktioniert nach denselben Regeln
wie ein Session-Objekt. Das zurückgegebene Indexobjekt muss in die richtige Anwendungsindexschnittstelle, z. B.
MapIndex, MapRangeIndex oder eine angepasste Indexschnittstelle, umgesetzt werden.
- Methode "clear"
- Die Methode "clear" entfernt alle Cacheeinträge aus einer Map in allen Partitionen.
Diese Operation ist eine Funktion für automatische Festschreibung. Deshalb darf keine aktive Transaktion vorhanden sein, wenn die
Methode "clear" aufgerufen wird.
Anmerkung: Die Methode "clear" löscht nur die Map, für die sie aufgerufen wird. Alle zugehörigen Entitäts-Maps bleiben von dieser Methode
unberührt.
Diese Methode ruft das Loader-Plug-in nicht auf.