Bereinigungsprogramme (Evictor) sind BackingMap-Instanzen zugeordnet.
import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
import com.ibm.websphere.objectgrid.ObjectGridManager;
import com.ibm.websphere.objectgrid.ObjectGrid;
import com.ibm.websphere.objectgrid.BackingMap;
import com.ibm.websphere.objectgrid.TTLType;
ObjectGridManager ogManager = ObjectGridManagerFactory.getObjectGridManager();
ObjectGrid og = ogManager.createObjectGrid( "grid" );
BackingMap bm = og.defineMap( "myMap" );
bm.setTtlEvictorType( TTLType.CREATION_TIME );
bm.setTimeToLive( 600 );
Das Argument für die Methode "setTimeToLive" ist 600 und gibt die Lebensdauer in Sekunden an. Der vorherige Code muss vor dem Aufruf der Methode "initialize" in der ObjectGrid-Instanz aufgerufen werden. Die BackingMap-Attribute können nach der Initialisierung der ObjectGrid-Instanz nicht mehr geändert werden. Nach der Ausführung des Codes haben alle Einträge, die in die BackingMap "myMap" eingefügt werden, eine Verfallszeit. Nach Ablauf der Verfallszeit entfernt das auf der Lebensdauer basierende Bereinigungsprogramm den Eintrag.
Wenn Sie die Verfallszeit auf die letzte Zugriffszeit plus 10 Minuten setzen möchten, ändern Sie das Argument, das an die Methode "setTtlEvictorType" übergeben wird, von TTLType.CREATION_TIME in TTLType.LAST_ACCESS_TIME. Mit diesem Wert wird die Verfallszeit mit der Formel "letzte Zugriffszeit plus zehn Minuten" berechnet. Bei der Erstellung eines Eintrags entspricht die letzte Zugriffszeit der Erstellungszeit. Wenn Sie die letzte Aktualisierung und nicht nur den letzten Zugriff (unabhängig davon, ob dieser eine Aktualisierung beinhaltet) als Basis für die Verfallszeit verwenden möchten, ersetzen Sie die TTLType.LAST_ACCESS_TIME durch TTLType.LAST_UPDATE_TIME.
Wenn Sie die Einstellung TTLType.LAST_ACCESS_TIME oder TTLType.LAST_UPDATE_TIME verwenden, können Sie die Schnittstellen "ObjectMap" und "JavaMap" verwenden, um den TTL-Wert für die BackingMap zu überschreiben. Dieser Mechanismus ermöglicht einer Anwendung, für jeden erstellten Eintrag einen anderen TTL-Wert zu verwenden. Angenommen, im vorherigen Code-Snippet wurde das Attribut "ttlType" auf LAST_ACCESS_TIME und der TTL-Wert auf 10 Minuten gesetzt. In diesem Fall kann eine Anwendung den TTL-Wert für jeden Eintrag ändern, indem sie den folgenden Code vor der Erstellung bzw. Änderung eines Eintrags ausführt:
import com.ibm.websphere.objectgrid.Session;
import com.ibm.websphere.objectgrid.ObjectMap;
Session session = og.getSession();
ObjectMap om = session.getMap( "myMap" );
int oldTimeToLive1 = om.setTimeToLive( 1800 );
om.insert("key1", "value1" );
int oldTimeToLive2 = om.setTimeToLive( 1200 );
om.insert("key2", "value2" );
Im vorherigen Code-Snippet hat der Eintrag mit dem Schlüssel "key1" aufgrund des Methodenaufrufs "setTimeToLive( 1800 ) in der ObjectMap-Instanz eine Verfallszeit, die der Einfügezeit plus 30 Minuten entspricht. Die Variable "oldTimeToLive1" wird auf 600 gesetzt, weil der TTL-Wert aus der BackingMap als Standardwert verwendet wird, wenn die Methode "setTimeToLive" in der ObjectMap-Instanz noch nicht aufgerufen wurde.
Der Eintrag mit dem Schlüssel "key2" hat aufgrund des Methodenaufrufs "setTimeToLive( 1200 )" in der ObjectMap-Instanz eine Verfallszeit, die der Einfügezeit plus 20 Minuten entspricht. Die Variable "oldTimeToLive2" wird auf 1800 gesetzt, weil der TTL-Wert aus dem vorherigen Aufruf der Methode "ObjectMap.setTimeToLive" den TTL-Wert auf 1800 gesetzt hat.
Das vorherige Beispiel zeigt zwei Map-Einträge, die in die Map "myMap" für die Schlüssel "key1" und "key2" eingefügt werden. Die Anwendung kann diese Map-Einträge später trotzdem aktualisieren und gleichzeitig die TTL-Werte beibehalten, die beim Einfügen jedes Map-Eintrags verwendet wurden. Das folgende Beispiel veranschaulicht, wie die TTL-Werte durch Verwendung einer in der Schnittstelle "ObjectMap" definierten Konstanten beibehalten werden können:
Session session = og.getSession();
ObjectMap om = session.getMap( "myMap" );
om.setTimeToLive( ObjectMap.USE_DEFAULT );
session.begin();
om.update("key1", "updated value1" );
om.update("key2", "updated value2" );
om.insert("key3", "value3" );
session.commit();
Da der Sonderwert ObjectMap.USE_DEFAULT im Aufruf der Methode "setTimeToLive" verwendet wird, behält der Schlüssel "key1" seinen TTL-Wert von 1800 Sekunden und der Schlüssel "key2" seinen TTL-Wert von 1200 Sekunden bei, weil diese Werte verwendet wurden, als diese Map-Einträge durch die vorherige Transaktion eingefügt wurden.
Das vorherige Beispiel zeigt auch einen neuen Map-Eintrag für den eingefügten Schlüssel "key3". In diesem Fall gibt der Sonderwert USE_DEFAULT an, dass die TTL-Standardeinstellung für diese Map zu verwenden ist. Der Standardwert wird mit dem TTL-Attribut der BackingMap definiert. Weitere Informationen zur Definition des TTL-Attributs in der BackingMap-Instanz finden Sie in der Beschreibung der Attribute der Schnittstelle "BackingMap".
Informationen zur Methode "setTimeToLive" in den Schnittstellen "ObjectMap" und "JavaMap" finden Sie in der API-Dokumentation. In der Dokumentation werden Sie darauf hingewiesen, dass eine Ausnahme des Typs "IllegalStateException" ausgelöst wird, wenn die Methode "BackingMap.getTtlEvictorType" einen anderen Wert als den Wert von TTLType.LAST_ACCESS_TIME bzw. TTLType.LAST_UPDATE_TIME zurückgibt. Die Schnittstellen "ObjectMap" und "JavaMap" können den TTL-Wert nur überschreiben, wenn die Einstellung LAST_ACCESS_TIME oder TTLType.LAST_UPDATE_TIME für das auf der Lebensdauer basierende Bereinigungsprogramm verwendet wird. Die Methode "setTimeToLive" kann nicht zum Überschreiben des TTL-Werts verwendet werden, wenn die Einstellung CREATION_TIME oder NONE für den Bereinigungsprogrammtyp verwendet wird.
Da Bereinigungsprogramme BackingMaps zugeordnet werden, verwenden Sie die Schnittstelle "BackingMap", um das Plug-in-Bereinigungsprogramm anzugeben. Das folgende Code-Snippet ist ein Beispiel für die Angabe eines LRUEvictor-Bereinigungsprogramms für die BackingMap "map1" und eines LFUEvictor-Bereinigungsprogramms für die BackingMap-Instanz "map2":
import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
import com.ibm.websphere.objectgrid.ObjectGridManager;
import com.ibm.websphere.objectgrid.ObjectGrid;
import com.ibm.websphere.objectgrid.BackingMap;
import com.ibm.websphere.objectgrid.plugins.builtins.LRUEvictor;
import com.ibm.websphere.objectgrid.plugins.builtins.LFUEvictor;
ObjectGridManager ogManager = ObjectGridManagerFactory.getObjectGridManager();
ObjectGrid og = ogManager.createObjectGrid( "grid" );
BackingMap bm = og.defineMap( "map1" );
LRUEvictor evictor = new LRUEvictor();
evictor.setMaxSize(1000);
evictor.setSleepTime( 15 );
evictor.setNumberOfLRUQueues( 53 );
bm.setEvictor(evictor);
bm = og.defineMap("map2");
LFUEvictor evictor2 = new LFUEvictor();
evictor2.setMaxSize(2000);
evictor2.setSleepTime( 15 );
evictor2.setNumberOfHeaps( 211 );
bm.setEvictor(evictor2);
Das vorherige Snippet zeigt, dass ein LRUEvictor-Evictor für die BackingMap "map1" mit einer ungefähren maximalen Anzahl von 53.000 (53 * 1000) Einträgen verwendet wird. Das LFUEvictor-Bereinigungsprogramm wird für die BackingMap "map2" mit einer ungefähren maximalen Anzahl von 422.000 (211 * 2000) Einträgen verwendet. Das LRU- und das LFU-Bereinigungsprogramm haben jeweils eine Ruhezeiteigenschaft, die angibt, wie lange das Bereinigungsprogramm ruht, bis es aktiviert wird und prüft, ob Einträge entfernt werden müssen. Die Ruhezeit wird in Sekunden angegeben. Mit einem Wert von 15 Sekunden kann erreicht werden, dass die Leistungseinbußen nicht zu hoch werden und die BackingMap nicht zu groß wird. Das Ziel ist, die größtmögliche Ruhezeit zu verwenden, aber gleichzeitig zu verhindern, dass die BackingMap zu groß wird.
Die Methode "setNumberOfLRUQueues" setzt die LRUEvictor-Eigenschaft, die angibt, wie viele LRU-Warteschlangen das Bereinigungsprogramm verwendet, um die LRU-Informationen zu verwalten. Es wird eine Sammlung von Warteschlangen verwendet, so dass nicht jeder Eintrag die LRU-Informationen in derselben Warteschlange hält. Dieser Ansatz kann die Leistung verbessern, indem die Anzahl der Map-Einträge, die in demselben Warteschlangenobjekt synchronisiert werden müssen, minimiert wird. Die Anzahl der Warteschlangen zu erhöhen, ist eine geeignete Methode, die Auswirkungen zu minimieren, die das LRU-Bereinigungsprogramm auf die Leistung haben kann. Ein guter Ausgangspunkt für die Anzahl der Warteschlangen sind zehn Prozent der maximalen Eintragsanzahl. Die Verwendung einer Primzahl ist gewöhnlich besser als die Verwendung einer anderen Zahl. Die Methode "setMaxSize" gibt an, wie viele Einträge in jeder Warteschlange zulässig sind. Wenn eine Warteschlange die maximal zulässige Eintragsanzahl erreicht, werden die Einträge mit dem ältesten Verwendungsdatum in dieser Warteschlange entfernt, wenn das Bereinigungsprogramm das nächste Mal prüft, ob Einträge entfernt werden müssen.
Die Methode "setNumberOfHeaps" legt mit der LFUEvictor-Eigenschaft fest, wie viele binäre Objekte im Heapspeicher der LFUEvictor für die Verwaltung der LFU-Informationen verwendet. Auch hier wird eine Sammlung verwendet, um die Leistung zu verbessern. Ein guter Ausgangspunkt sind zehn Prozent der maximalen Eintragsanzahl, und die Verwendung einer Primzahl ist gewöhnlich besser als die Verwendung einer anderen Zahl. Die Methode "setMaxSize" gibt an, wie viele Einträge in jedem Heapspeicher zulässig sind. Wenn ein Heapspeicher die maximal zulässige Eintragsanzahl erreicht, werden die Einträge, die am seltensten verwendet wurden, aus diesem Heapspeicher entfernt, wenn das Bereinigungsprogramm das nächste Mal prüft, ob Einträge entfernt werden müssen.