Session-Objekte für den Zugriff auf Daten im Grid verwenden

Anwendungen können Transaktionen über die Schnittstelle "Session" starten und beenden. Die Schnittstelle "Session" ermöglicht auch den Zugriff auf die anwendungsbasierten Schnittstellen ObjectMap und JavaMap.

Jede ObjectMap- bzw. JavaMap-Instanz ist direkt an ein bestimmtes Session-Objekt gebunden. Jeder Thread, der auf eXtreme Scale zugreifen möchte, muss zuerst ein Session-Objekt vom ObjectGrid-Objekt abrufen. Eine Session-Instanz kann nicht gleichzeitig von mehreren Threads genutzt werden. WebSphere eXtreme Scale verwendet keinen Thread-eigenen Speicher, aber Plattformbeschränkungen können die Möglichkeit, ein Session-Objekt von einem Thread an den anderen zu übergeben, einschränken.

Methoden

Methode "get"

Eine Anwendung ruft eine Session-Instanz von einem ObjectGrid-Objekt über die Methode "ObjectGrid.getSession" ab. Das folgende Beispiel veranschaulicht, wie eine Session-Instanz abgerufen wird:

ObjectGrid objectGrid = ...; Session sess = objectGrid.getSession();

Nach dem Abruf einer Session-Instanz verwaltet der Thread eine Referenz zur eigenen Verwendung auf das Session-Objekt. Wenn Sie die Methode getSession mehrfach aufrufen, wird jedesmal ein neues Session-Objekt zurückgegeben.

Transaktionen und Session-Methoden

Ein Session-Objekt kann verwendet werden, um Transaktionen zu starten, festzuschreiben oder rückgängig zu machen. Operationen für BackingMaps über ObjectMaps und JavaMaps werden am effizientesten in einer Session-Transaktion durchgeführt. Nach dem Starten einer Transaktion werden alle Änderungen, die an einer oder mehreren BackingMaps im Geltungsbereich dieser Transaktion vorgenommen, in einem speziellen Transaktionscache gespeichert, bis die Transaktion festgeschrieben wird. Wenn eine Transaktion festgeschrieben wird, werden die offenen Änderungen auf die BackingMaps und Loader angewendet und werden damit für andere Clients dieses ObjectGrids sichtbar.

WebSphere eXtreme Scale unterstützt auch die Möglichkeit, Transaktionen automatisch festzuschreiben (auto-commit). Wenn ObjectMap-Operationen außerhalb des Kontextes einer aktiven Transaktion durchgeführt werden, wird eine implizite Transaktion gestartet, bevor die Operation und die Transaktion vor der Rückgabe der Steuerung an die Anwendung festgeschrieben werden.

Session session = objectGrid.getSession();
ObjectMap objectMap = session.getMap("someMap");
session.begin();
objectMap.insert("key1", "value1");
objectMap.insert("key2", "value2");
session.commit();
objectMap.insert("key3", "value3"); // auto−commit

Methode "Session.flush"

Die Methode "Session.flush" ist nur sinnvoll, wenn einer BackingMap ein Loader zugeordnet ist. Die Flush-Methode ruft den Loader mit dem aktuellen Änderungssatz im Transaktionscache auf. Der Loader wendet die Änderungen auf das Back-End an. Diese Änderungen werden beim Aufruf der Flush-Operation nicht festgeschrieben. Wenn eine Session-Transaktion nach dem Aufruf einer Flush-Operation festgeschrieben wird, werden nur die Aktualisierungen auf den Loader angewendet, die nach dem Aufruf der Flush-Methode vorgenommen wurden. Wenn eine Session-Transaktion nach dem Aufruf einer Flush-Methode rückgängig gemacht wird, werden die mit Flush übertragenen Änderungen zusammen mit allen anderen offenen Änderungen in der Transaktion verworfen. Verwenden Sie die Flush-Methode sparsam, weil sie die Möglichkeit von Stapeloperationen für einen Loader beschränkt. Im Folgenden sehen Sie ein Beispiel für die Verwendung der Methode "Session.flush":

Session session = objectGrid.getSession();
session.begin();
// Änderungen vornehmen
...
session.flush(); // Änderungen mit Push an den Loader übertragen, aber noch nicht festschreiben
// Weitere Änderungen vornehmen
...
session.commit();

Methode "NoWriteThrough"

Einige Maps werden durch einen Loader gestützt, der einen persistenten Speicher für die Daten in der Map bereitstellt. Manchmal ist es hilfreich, Daten nur in der eXtreme-Scale-Map festzuschreiben und nicht mit Push an den Loader zu übertragen. Die Schnittstelle "Session" stellt zu diesem Zweck die Methode "beginNoWriteThough" bereit. Die Methode "beginNoWriteThrough" startet wie die Methode "begin" eine Transaktion. Wenn Sie die Methode "beginNoWriteThrough" verwenden und die Transaktion festgeschrieben wird, werden die Daten nur in der speicherinternen Map festschrieben und nicht in dem vom Loader bereitgestellten persistenten Speicher. Diese Methode ist sehr hilfreich beim vorherigen Laden von Daten in die Map.

Wenn Sie eine verteilte ObjectGrid-Instanz verwenden, ist die Methode "beginNoWriteThrough" hilfreich, um Änderungen nur im nahen Cache vorzunehmen, ohne den fernen Cache auf dem Server zu ändern. Wenn bekannt ist, dass die Daten im nahen Cache veraltet sind, können mit der Methode "beginNoWriteThrough" Einträge im nahen Cache ungültig gemacht werden, ohne sie auch im Server ungültig zu machen.

Die Schnittstelle "Session" stellt auch die Methode isWriteThroughEnabled bereit, mit der Sie feststellen können, welcher Typ von Transaktion momentan aktiv ist:

Session session = objectGrid.getSession();
session.beginNoWriteThrough();
// Änderungen vornehmen
session.commit(); // Diese Änderungen werden nicht mit Push an den Loader übertragen

Methode zum Abrufen des TxID-Objekts

Das TxID-Objekt ist ein nicht transparentes Objekt, das die aktive Transaktion identifiziert. Verwenden Sie das TxID-Objekt für die folgenden Zwecke:

  • für Vergleiche, wenn Sie eine bestimmte Transaktion suchen,
  • zum Speichern der von den TransactionCallback- und Loader-Objekten gemeinsam genutzten Daten.

Weitere Informationen zum Objekt-Slot-Feature finden Sie in den Beschreibungen von TransactionCallback-Plug-ins und Loadern.

Methode für Leistungsüberwachung

Wenn Sie eXtreme Scale in WebSphere Application Server verwenden, kann es erforderlich sein, den Transaktionstyp für die Leistungsüberwachung zurückzusetzen. Sie können den Transaktionstyp mit der Methode "setTransactionType" festlegen. Weitere Informationen zur Methode "setTransactionType" finden Sie im Abschnitt zur Überwachung der ObjectGrid-Leistung mit WebSphere Application Server Performance Monitoring Infrastructure (PMI).

Methode zur Verarbeitung eines vollständigen LogSequence-Objekts

WebSphere eXtreme Scale kann ganze Sätze von Map-Änderungen an ObjectGrid-Listener zum Verteilen von Maps von einer Java Virtual Machine an eine andere weitergeben. Um dem Listener die Verarbeitung empfangener LogSequence-Objekte zu erleichtern, stellt die Schnittstelle "Session" die Methode "processLogSequence" bereit. Diese Methode untersucht jedes LogElement-Objekt im LogSequence-Objekt und führt die entsprechende Operation, z. B. insert (Einfügen), update (Aktualisieren), invalidate (Ungültigmachen) usw, für die BackingMap aus, die mit dem Argument "MapName" des LogSequence-Objekts angegeben wurde. Es muss eine ObjectGrid-Sitzung verfügbar sein, bevor die Methode "processLogSequence" aufgerufen wird. Die Anwendung ist auch für das Absetzen der entsprechenden Commit- und Rollback-Aufrufe zuständig, um die Sitzung zu beenden. Die automatische Festschreibungsverarbeitung ist für diesen Methodenaufruf nicht verfügbar. Normalerweise startet der empfangende ObjectGridEventListener der fernen JVM ein Session-Objekt mit der Methode "beginNoWriteThrough", wodurch eine endlose Weitergabe von Änderungen verhindert wird. Anschließend setzt er einen Aufruf an die Methode "processLogSequence" ab und schreibt dann die Transaktion fest bzw. macht sie rückgängig.

// Bei der Initialisierung des ObjectGridEventListeners
// übergebenes Session-Objekt verwenden...
session.beginNoWriteThrough();
// Empfangenes LogSequence-Objekt verarbeiten
try {
	session.processLogSequence(receivedLogSequence);
}catch (Exception e) {
	session.rollback(); throw e;
}
// Änderungen festschreiben
session.commit();

Methode "markRollbackOnly"

Diese Methode wird verwendet, um die aktuelle Transaktion als "rollback only" (Nur Rollback) kennzuzeichnen. Das Kennzeichnen einer Transaktion als "rollback only" stellt sicher, dass die Transaktion auch dann rückgängig gemacht wird, wenn die Methode "commit" von der Anwendung aufgerufen wird. Diese Methode wird gewöhnlich von ObjectGrid selbst oder von der Anwendung verwendet, wenn diese weiß, dass Daten beschädigt werden könnten, wenn die Transaktion festgeschrieben wird. Nach dem Aufruf dieser Methode wird das an diese Methode übergebene Throwable-Objekt mit der Ausnahme "com.ibm.websphere.objectgrid.TransactionException" verkettet, die von der Methode "commit" ausgelöst wird, wenn diese für ein Session-Objekt aufgerufen wird, das zuvor als "rollback only" gekennzeichnet wurde. Alle nachfolgenden Aufrufe dieser Methode für eine Transaktion, die bereits mit "rollback only" gekennzeichnet ist, werden ignoriert, d. h., es wird nur der erste Aufruf, der eine Throwable-Referenz ungleich null übergibt, verwendet. Sobald die gekennzeichnete Transaktion abgeschlossen ist, wird die Markierung "rollback only" entfernt, so dass die nächste Transaktion, die vom Session-Objekt gestartet wird, festgeschrieben werden kann.

Methode "isMarkedRollbackOnly"

Diese Methode gibt zurück, ob das Session-Objekt als "rollback only" markiert ist. Diese Methode gibt den booleschen Wert "true" zurück, wenn die Methode "markRollbackOnly" vorher in diesem Session-Objekt aufgerufen wurde und die vom Session-Objekt gestartete Transaktion immer noch aktiv ist.

Methode "setTransactionTimeout"

Setzen Sie das Transaktionszeitlimit für die nächste von diesem Session-Objekt gestartete Transaktion auf eine bestimmte Anzahl von Sekunden. Diese Methode hat keine Auswirkung auf das Transaktionszeitlimit von Transaktionen, die bereits von diesem Session-Objekt gestartet wurden. Sie beeinflusst nur die Transaktionen, die nach dem Aufruf dieser Methode gestartet werden. Wenn Sie diese Methode nicht aufrufen, wird der Zeitlimitwert verwendet, der an die Methode "setTxTimeout" der Methode "com.ibm.websphere.objectgrid.ObjectGrid" übergeben wurde.

Methode "getTransactionTimeout"

Diese Methode gibt den Transaktionszeitlimitwert in Sekunden zurück. Es wird der Wert, der als Zeitlimitwert an die Methode "setTransactionTimeout" übergeben wurde, von dieser Methode zurückgegeben. Wenn Sie die Methode "setTransactionTimeout" nicht aufrufen, wird der Zeitlimitwert verwendet, der an die Methode "setTxTimeout" der Methode "com.ibm.websphere.objectgrid.ObjectGrid" übergeben wurde.

Methode "transactionTimedOut"

Diese Methode gibt den booleschen Wert "true" zurück, wenn die aktuelle Transaktion, die von diesem Session-Objekt gestartet wurde, das zulässige Zeitlimit überschreitet.

Methode "isFlushing"

Diese Methode gibt den booleschen Wert "true" zurück, wenn alle Transaktionsänderungen auf den Aufruf der Methode "flush" in der Schnittstelle "Session" hin an den Loader übertragen wurden. Für ein Loader-Plug-in kann diese Methode hilfreich sein, wenn es wissen muss, warum seine Methode "batchUpdate" aufgerufen wurde.

Methode "isCommitting"

Diese Methode gibt den booleschen Wert "true" zurück, wenn alle Transaktionsänderungen auf den Aufruf der Methode "commit" der Schnittstelle "Session" hin festgeschrieben wurden. Für ein Loader-Plug-in kann diese Methode hilfreich sein, wenn es wissen muss, warum seine Methode "batchUpdate" aufgerufen wurde.

Methode "setRequestRetryTimeout"

Diese Methode legt den Zeitlimitwert für Anforderungswiederholungen in Millisekunden fest. Wenn der Client ein Zeitlimit für Anforderungswiederholungen gesetzt hat, überschreibt die Sitzungseinstellung den Clientwert.

Methode "getRequestRetryTimeout"

Diese Methode ruft die aktuelle Zeitlimiteinstellung für Anforderungswiederholungen in der Sitzung ab. Der Wert -1 zeigt an, dass kein Zeitlimit definiert wurde. Der Wert 0 zeigt an, dass der Modus für schnelles Fehlschlagen (fast-fail) aktiv ist. Ein Wert größer als 0 zeigt die Zeitlimiteinstellung in Millisekunden an.