Jede ObjectGrid-Instanz enthält eine Sammlung von BackingMap-Objekten.
Verwenden Sie die Methode "defineMap" oder die Methode "createMap" der Schnittstelle
"ObjectGrid", um jede BackingMap zu benennen und einer ObjectGrid-Instanz hinzuzufügen.
Diese Methoden geben eine BackingMap-Instanz zurück, die anschließend zum Definieren des Verhaltens einer einzelnen Map verwendet wird.
Sie können sich eine BackingMap als Speichercache festgeschriebener Daten für eine einzelne Map vorstellen.
Schnittstelle "Session"
Die
Schnittstelle "Session" wird verwendet, um eine Transaktion zu starten und das
ObjectMap- bzw. JavaMap-Objekt abzurufen, das für die transaktionsorientierte Interaktion zwischen einer Anwendung
und einem BackingMap-Objekt erforderlich ist. Die Transaktionsänderungen werden jedoch erst dann auf das
BackingMap-Objekt angewendet, wenn die Transaktion festgeschrieben wird.
Sie können sich eine BackingMap als Speichercache festgeschriebener Daten für eine einzelne Map vorstellen.
Weitere Einzelheiten finden Sie in Session-Objekte für den Zugriff auf Daten im Grid verwenden.
Die Schnittstelle "BackingMap" stellt Methoden für die Festlegung von
BackingMap-Attributen bereit.
Einige der set-Methoden unterstützen die Erweiterbarkeit einer BackingMap über mehrere angepasste Plug-ins.
In der folgenden Liste sind die set-Methoden für die Festlegung von Attributen und die Bereitstellung
angepasster Plug-in-Unterstützung aufgeführt:
// Für die Festlegung von BackingMap-Attributen.
public void setReadOnly(boolean readOnlyEnabled);
public void setNullValuesSupported(boolean nullValuesSupported);
public void setLockStrategy( LockStrategy lockStrategy );
public void setCopyMode(CopyMode mode, Class valueInterface);
public void setCopyKey(boolean b);
public void setNumberOfBuckets(int numBuckets);
public void setNumberOfLockBuckets(int numBuckets);
public void setLockTimeout(int seconds);
public void setTimeToLive(int seconds);
public void setTtlEvictorType(TTLType type);
public void setEvictionTriggers(String evictionTriggers);
// Für die Festlegung eines optionalen angepassten Plug-ins, das von der
// Anwendung bereitgestellt wird.
public abstract void setObjectTransformer(ObjectTransformer t);
public abstract void setOptimisticCallback(OptimisticCallback checker);
public abstract void setLoader(Loader loader);
public abstract void setPreloadMode(boolean async);
public abstract void setEvictor(Evictor e);
public void setMapEventListeners( List /*MapEventListener*/ eventListenerList );
public void addMapEventListener(MapEventListener eventListener );
public void removeMapEventListener(MapEventListener eventListener );
public void addMapIndexPlugin(MapIndexPlugin index);
public void setMapIndexPlugins(List /\* MapIndexPlugin \*/ indexList );
public void createDynamicIndex(String name, boolean isRangeIndex,
String attributeName, DynamicIndexCallback cb);
public void createDynamicIndex(MapIndexPlugin index, DynamicIndexCallback cb);
public void removeDynamicIndex(String name);
Für jede der aufgelisteten set-Methoden
gibt es eine entsprechende get-Methode.
BackingMap-Attribute
Jede BackingMap hat die folgenden Attribute,
die gesetzt werden können, um das Verhalten der BackingMap zu ändern bzw. zu steuern:
- ReadOnly: Dieses Attribut gibt an, ob die Map eine schreibgeschützte Map oder eine Map mit Lese- und Schreibzugriff ist.
Wenn dieses Attribut für die Map nicht gesetzt wird, ist die Map standardmäßig
eine Map mit Lese- und Schreibzugriff. Wenn eine BackingMap schreibgeschützt ist,
optimiert ObjectGrid die Leistung von Leseoperationen nur, wenn dies möglich ist.
- NullValuesSupported: Dieses Attribut gibt an, ob ein Nullwert in der Map gespeichert werden kann.
Wenn dieses Attribut nicht gesetzt wird, unterstützt die Map keine Nullwerte.
Wenn Nullwerte von der Map unterstützt werden, kann eine get-Operation, die null zurückgibt,
bedeuten, dass der Wert null ist oder dass die Map den mit der get-Operation angegebenen Schlüssel
nicht enthält.
- LockStrategy: Dieses Attribut bestimmt, ob ein Sperrenmanager von der
BackingMap verwendet wird. Wenn ein Sperrenmanager verwendet wird, wird das Attribut "LockStrategy" verwendet, um anzuzeigen, ob
ein optimistischer oder pessimistischer Sperransatz für das Sperren der Map-Einträge verwendet wird.
Wenn dieses Attribut nicht gesetzt wird, wird die optimistische Sperrstrategie verwendet.
Weitere Einzelheiten zu den unterstützten Sperrstrategien finden Sie im Abschnitt "Sperren".
- CopyMode: Dieses Attribut bestimmt, ob eine Kopie eines Wertobjekts von der
BackingMap erstellt wird, wenn ein Wert aus der Map gelesen oder in der Map im Festschreibungszyklus einer Transaktion gespeichert wird.
Es werden verschiedene Kopiermodi unterstützt, damit die Anwendung
zwischen Leistung und Datenintegrität abwägen kann.
Wenn dieses Attribut nicht gesetzt wird, wird der
Kopiermodus COPY_ON_READ_AND_COMMIT verwendet. Dieser Kopiermodus bietet zwar nicht die beste Leistung, aber
den größten Schutz vor Datenintegritätsproblemen.
Wenn die BackingMap einer Entität der API "EntityManager" zugeordnet ist, hat die CopyMode-Einstellung
keine Wirkung, sofern das Attribut nicht den Wert COPY_TO_BYTES hat. Jede andere CopyMode-Einstellung
wird automatisch auf NO_COPY gesetzt. Zum Überschreiben der CopyMode-Einstellung für eine Entitäts-Map
verwenden Sie die Methode "ObjectMap.setCopyMode".
Weitere Einzelheiten zu den Kopiermodi finden Sie in Kopiermodus optimieren.
- CopyKey: Dieses Attribut bestimmt, ob die BackingMap eine Kopie eines Schlüsselobjekts erstellt, wenn ein Eintrag in der Map erstellt wird.
Standardmäßig wird keine Kopie von Schlüsselobjekten erstellt, weil die Schlüssel normalerweise unveränderliche Objekte
sind.
- NumberOfBuckets: Dieses Attribut gibt die Anzahl der von der BackingMap zu verwendenden Hash-Buckets an.
Die BackingMap-Implementierung verwendet eine Hash-Tabelle für ihre Implementierung.
Wenn sehr viele Einträge in der BackingMap enthalten sind, kann mit einer höheren Bucket-Anzahl eine bessere Leistung
erzielt werden. Die Anzahl der Schlüssel, die dasselbe Bucket haben, nimmt ab, je höher die Anzahl der Buckets wird.
Mehr Buckets bedeuten auch mehr gemeinsame Zugriffe. Dieses Attribut ist hilfreich für die Feinabstimmung der Leistung.
Es wird ein nicht definierter Standardwert verwendet, wenn die Anwendung das
Attribut "NumberOfBuckets" nicht definiert.
- NumberOfLockBuckets: Dieses Attribut gibt die Anzahl der Sperr-Buckets an, die der Sperrenmanager für diese
BackingMap verwenden soll.
Wenn das Attribut "LockStrategy" auf OPTIMISTIC oder PESSIMISTIC gesetzt wird, wird ein Sperrenmanager für die BackingMap erstellt.
Der Sperrenmanager verwendet eine Hash-Tabelle, um die Einträge zu verfolgen, die von einer oder mehreren
Transaktionen gesperrt werden.
Wenn sehr viele Einträge in der Hash-Tabelle enthalten sind, kann mit einer höheren Anzahl an Sperr-Buckets eine bessere Leistung erzielt werden,
weil die Anzahl kollidierender Schlüssel im selben Bucket mit zunehmender Bucket-Anzahl sinkt.
Mehr Sperr-Buckets bedeuten auch mehr gemeinsame Zugriffe.
Wenn das Attribut "LockStrategy" auf "NONE" gesetzt wird, wird kein Sperrenmanager von der BackingMap verwendet.
In diesem Fall hat die Definition des Attributs "numberOfLockBuckets" keine Wirkung.
Wenn dieses Attribut nicht gesetzt wird, wird ein nicht definierter Wert verwendet.
- LockTimeout: Dieses Attribut wird verwendet, wenn die BackingMap einen Sperrenmanager verwendet.
Die BackingMap verwendet einen Sperrenmanager, wenn das Attribut "LockStrategy" auf OPTIMISTIC oder PESSIMISTIC
gesetzt ist. Der Attributwert wird in Sekunden angegeben und bestimmt, wie lange der Sperrenmanager
auf die Erteilung einer Sperre wartet.
Wenn dieses Attribut nicht gesetzt wird, werden 15 Sekunden als Wert für "LockTimeout" verwendet.
Einzelheiten zu den Ausnahmen für das Wartezeitlimit für Sperren
finden Sie in der Beschreibung der pessimistischen Sperrstrategie.
- TtlEvictorType: Jede BackingMap hat einen integriertes TTL-Evictor (Time-to-Live, Lebensdauer), das einen zeitbasierten
Algorithmus verwendet, um die zu entfernenden Map-Einträge zu bestimmen.
Standardmäßig ist der integrierte TTL-Evictor nicht aktiv.
Sie können den TTL-Evictor aktivieren, indem Sie die Methode
"setTtlEvictorType" mit einem der folgenden Werte aufrufen: CREATION_TIME,
LAST_ACCESS_TIME, LAST_UPDATE_TIME, oder NONE. Der Wert CREATION_TIME zeigt an, dass der Evictor
den TimeToLive-Attributwert der Zeit hinzufügt, zu der der Map-Eintrag in der BackingMap erstellt wurde,
um zu bestimmen, wann der MapEintrag aus der BackingMap entfernt werden muss.
Der Wert LAST_ACCESS_TIME (bzw. LAST_UPDATE_TIME) zeigt an, dass der Evictor den
TimeToLive-Attributwert der Zeit hinzufügt, zu der der Map-Eintrag zuletzt von einer Transaktion, die in der Anwendung ausgeführt wird,
aufgerufen (bzw. aufgerufen und akualisiert) wurde, um zu bestimmen, wann der Map-Eintrag entfernt werden muss.
Der Map-Eintrag wird nur entfernt, wenn er in dem mit dem Attribut "TimeToLive" festgelegten Zeitraum
nicht von einer Transaktion aufgerufen wird.
Der Wert NONE zeigt an, dass der Evictor inaktiv bleibt und keine Map-Einträge entfernt.
Wenn dieses Attribut nicht gesetzt wird, wird NONE als Standardwert verwendet, und der TTL-Evictor
wird nicht aktiv.
Einzelheiten zum integrierten TTL-Evictor finden Sie in der Beschreibung der Evictor.
- TimeToLive: Dieses Attribut wird verwendet, um die Anzahl der Sekunden anzugeben, die den TTL-Evictor
der Erstellungs- bzw. letzten Zugriffszeit für jeden Eintrag gemäß der Beschreibung des Attributs "TtlEvictorType" hinzufügen muss.
Wenn dieses Attribut nicht gesetzt wird, wird der Sonderwert null verwendet, um anzuzeigen, dass die Lebensdauer unbegrenzt ist.
Wenn Sie dieses Attribut auf "infinity" setzen, werden die Map-Einträge vom Evictor nicht entfernt.
Das folgende Beispiel veranschaulicht, wie Sie die BackingMap "someMap"
in der ObjectGrid-Instanz "someGrid" definieren und verschiedene Attribute der
BackingMap mit den set-Methoden der Schnittstelle "BackingMap" setzen:
import com.ibm.websphere.objectgrid.BackingMap;
import com.ibm.websphere.objectgrid.LockStrategy;
import com.ibm.websphere.objectgrid.ObjectGrid;
import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
...
ObjectGrid og =
ObjectGridManagerFactory.getObjectGridManager().createObjectGrid("someGrid");
BackingMap bm = objectGrid.getMap("someMap");
bm.setReadOnly( true ); // Standardeinstellung Lese-/Schreibzugriff überschreiben
bm.setNullValuesSupported(false);
// Standardmäßiges Zulassen von Nullwerten überschreiben
bm.setLockStrategy( LockStrategy.PESSIMISTIC );
// Standardeinstellung OPTIMISTIC überschreiben
bm.setLockTimeout( 60 );
// Standardeinstellung von 15 Sekunden überschreiben
bm.setNumberOfBuckets(251);
// Standardeinstellung überschreiben (Primzahlen funktionieren am besten)
bm.setNumberOfLockBuckets(251);
// Standardeinstellung überschreiben (Primzahlen funktionieren am besten)
BackingMap-Plug-ins
Die Schnittstelle "BackingMap" hat mehrere
optionale Plug-in-Punkte für erweiterbare Interaktionen mit dem
ObjectGrid:
- ObjectTransformer-Plug-in: Für einige Map-Operationen muss eine BackingMap möglicherweise
einen Schlüssel oder Wert eines Eintrags serialisieren, entserialisieren oder kopieren.
Die BackingMap kann diese Aktion über eine Standardimplementierung der Schnittstelle "ObjectTransformer" ausführen.
Eine Anwendung kann die Leistung verbessern, indem sie ein angepasstes
ObjectTransformer-Plug-in bereitstellt, das von der BackingMap zum Serialisieren, Entserialisieren
oder Kopieren des Schlüssels oder Werts eines Eintrags verwendet.
Weitere Einzelheiten finden Sie in ObjectTransformer-Plug-in.
- Evictor-Plug-in: Der integrierte TTL-Evictor verwendet einen zeitbasierten
Algorithmus, um zu entscheiden, wann ein Eintrag aus der BackingMap entfernt werden muss.
Einige Anwendungen müssen möglicherweise einen anderen Algorithmus für das Entfernen eines Eintrags aus einer BackingMap verwenden.
Das Evictor-Plug-in stellt der BackingMap einen angepassten Evictor zur Verfügung.
Das Evictor-Plug-in ist eine Erweiterung des integrierten TTL-Evictors.
Es ist kein Ersatz für den TTL-Evictor. ObjectGrid
stellt ein angepasstes Evictor-Plug-in bereit, das bekannte Algorithmen wie
LRU (Least Recently Used) oder LFU (Least Frequently Used) implementiert.
Anwendungen können eines der bereitgestellten Evictor-Plug-ins integrieren
oder ein eigenes Evictor-Plug-in bereitstellen.
Weitere Einzelheiten finden Sie in Plug-ins für die Bereinigung von Cacheobjekten.
- MapEventListener-Plug-in: Eine Anwendung möchte möglicherweise
über BackingMap-Ereignisse, wie z. B. das Entfernen von Map-Einträgen oder den Abschluss
des Preload-Prozesses für die BackingMap, benachrichtigt werden.
Eine BackingMap ruft Methoden im MapEventListener-Plug-in auf, um eine Anwendung
über BackingMap-Ereignisse zu benachrichtigen. Eine Anwendung kann Benachrichtigungen über
verschiedene BackingMap-Ereignisse empfangen, indem sie die Methode
"setMapEventListener" verwendet, um der BackingMap ein oder mehrere angepasste
MapEventListener-Plug-ins bereitzustellen. Die Anwendung kann die aufgelisteten
MapEventListener-Objekte mit der Methode "addMapEventListener"
oder mit der Methode "removeMapEventListener" ändern. Weitere Einzelheiten finden Sie in MapEventListener-Plug-in.
- Loader-Plug-in: Eine BackingMap ist ein Speichercache einer Map.
Ein Loader-Plug-in ist eine Option, die von der BackingMap
verwendet wird, um Daten zwischen dem Hauptspeicher und einem persistenten Speicher zu verschieben.
Es kann beispielsweise ein JDBC-Loader (Java Database
Connectivity) verwendet werden, um Daten in eine BackingMap
und eine oder mehrere relationale Tabellen einer relationalen Datenbank bzw. aus diesen zu verschieben.
Es muss keine relationale Datenbank als persistenter Speicher für eine BackingMap verwendet werden.
Der Loader kann auch verwendet werden, um Daten zwischen einer
BackingMap und einer Datei, zwischen einer BackingMap und einer Hibernate-Map, zwischen einer
BackingMap und einer JEE-Entity-Bean (Java 2
Platform, Enterprise Edition), zwischen einer BackingMap und einem anderen Anwendungsserver usw. zu verschieben.
Die Anwendung muss ein angepasstes Loader-Plug-in bereitstellen, um Daten zwischen der BackingMap
und dem persistenten Speicher für jede verwendete Technologie zu verschieben. Wenn kein Loader bereitgestellt wird, ist die
BackingMap ein einfacher Speichercache.
Weitere Einzelheiten finden Sie in Plug-ins für die Kommunikation mit Datenbanken.
- OptimisticCallback-Plug-in: Wenn das Attribut "LockStrategy" für eine
BackingMap auf OPTIMISTIC gesetzt ist, muss die BackingMap oder ein
Loader-Plug-in Vergleichsoperationen für die Werte der Map durchführen.
Das OptimisticCallback-Plug-in wird von der BackingMap bzw. dem Loader für die
Durchführung von Vergleichsoperationen für eine optimistische Versionssteuerung verwendet.
Weitere Einzelheiten finden Sie in Plug-ins für die Versionssteuerung und den Vergleich von Cacheobjekten.
- MapIndexPlugin-Plug-in: Ein MapIndexPlugin-Plug-in (oder kurz Index)
ist eine Option, die die BackingMap verwendet, um einen Index zu erstellen, der auf dem angegebenen Attribut des gespeicherten Objekts basiert.
Der Index ermöglicht der Anwendung, Objekte anhand eines bestimmten Werts oder Wertebereichs zu finden.
Es gibt zwei Typen von Indizes: statische und dynamische.
Ausführliche Informationen finden Sie in der Beschreibung der Indexierung.
Weitere Informationen zu Plug-ins finden Sie in Übersicht über Plug-ins.