Evictor は、BackingMap インスタンスと関連しています。
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 );
setTimeToLive メソッドの引数は、存続時間の値が秒単位であることを指示するため、600 になっています。 前掲のコードは、ObjectGrid インスタンス で initialize メソッドを呼び出す前に実行する必要があります。 これらの BackingMap 属性は、ObjectGrid の初期化後に変更することはできません。 コードが実行された後、myMap BackingMap 内に挿入されたエントリーには有効期限の時間が設定されます。 有効期限の時間に達すると、TTL Evictor はそのエントリーを除去します。
有効期限の時間を最終アクセス時刻プラス 10 分に設定するには、setTtlEvictorType メソッドに渡される引数を TTLType.CREATION_TIME から TTLType.LAST_ACCESS_TIME に変更します。 この値を使用すると、有効期限の時間は最終アクセス時刻プラス 10 分として計算されます。 最初にエントリーが作成されたときの最終アクセス時刻は、作成時刻です。 (更新を伴ったかどうかに関わらず) 単純に最終 アクセス をベースにするのではなく、最終 更新 をベースにして有効期限を設定するには、TTLType.LAST_ACCESS_TIME 設定を TTLType.LAST_UPDATE_TIME 設定に置き換えてください。
TTLType.LAST_ACCESS_TIME または TTLType.LAST_UPDATE_TIME 設定を使用する場合、ObjectMap インターフェースおよび JavaMap インターフェースを使用して、BackingMap の存続時間の値をオーバーライドすることができます。この機構により、アプリケーションが、作成される各エントリーに対して異なる存続時間の値を使用できるようになります。 前述のコード・スニペットが ttlType 属性を LAST_ACCESS_TIME に設定し、存続時間の値を 10 分に設定したと想定します。 アプリケーションは、エントリーを作成または変更する前に次のコードを実行して、各エントリーの存続時間をオーバーライドします。
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" );
前掲のコード・スニペットでは、key1 キーを持つエントリーの有効期限の時間は、ObjectMap インスタンスの setTimeToLive( 1800 ) メソッドを呼び出した結果、挿入時刻プラス 30 分になります。 oldTimeToLive1 変数は 600 に設定されます。それは、以前に ObjectMap インスタンスの setTimeToLive メソッドが呼び出されていなかった場合は、デフォルト値として BackingMap の存続時間の値が使用されるからです。
key2 キーを持つエントリーの有効期限の時間は、ObjectMap インスタンスの setTimeToLive( 1200 ) メソッドを呼び出した結果、挿入時刻プラス 20 分になります。 oldTimeToLive2 変数は 1800 に設定されます。それは、前の ObjectMap.setTimeToLive メソッド呼び出しで存続時間の値が 1800 に設定されたからです。
前の例では、キーが key1 と key2 の 2 つのマップ・エントリーが、myMap マップに挿入されています。 アプリケーションは、挿入時にマップ・エントリーごとに 使用された存続時間の値を保持しながら、より後の時点でもこれらのマップ・エントリーを更新することができます。 以下の例では、ObjectMap インターフェースで定義されている定数を使用して、存続時間値を保持する方法を示しています。
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();
ObjectMap.USE_DEFAULT 特殊値は setTimeToLive メソッド呼び出しで使用されるので、key1 キーには 1800 秒、key2 キーには 1200 秒の存続時間値が保管されます。これらの値が、前のトランザクションでこれらのマップ・エントリーが挿入されたときに使用されたためです。
前の例では、key3 キーの新規マップ・エントリーの挿入も示されています。この場合、USE_DEFAULT 特殊値は、このマップの存続時間値にデフォルト設定を使用することを示しています。 デフォルト値は、BackingMap の存続時間属性により定義されます。BackingMap インスタンスの存続時間属性をどのように定義するかについては、BackingMap インターフェース属性を参照してください。
ObjectMap インターフェースおよび JavaMap インターフェースの setTimeToLive メソッドについては、API の資料を参照してください。 この資料では、BackingMap.getTtlEvictorType メソッドから TTLType.LAST_ACCESS_TIME または TTLType.LAST_UPDATE_TIME 以外の値が戻された場合は、IllegalStateException 例外が生じることを説明しています。ObjectMap インターフェースおよび JavaMap インターフェースは、TTL Evictor タイプに LAST_ACCESS_TIME または TTLType.LAST_UPDATE_TIME 設定を使用している場合のみ、存続時間の値をオーバーライドすることができます。setTimeToLive メソッドは、Evictor タイプ設定に CREATION_TIME または NONE を使用しているときに、存続時間の値をオーバーライドする場合には使用できません。
Evictor は BackingMap に関連付けられているため、BackingMap インターフェースを使用してプラグ可能 Evictor を指定します。次のコード・スニペットは、map1 BackingMap インスタンス用に LRUEvictor Evictor、および map2 BackingMap インスタンス用に LFUEvictor Evictor を指定する例です。
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);
上記のスニペットは、概算最大エントリー数が 53,000 (53 x 1000) である map1 BackingMap に使用される LRUEvictor Evictor を示しています。 LFUEvictor Evictor は、概算最大エントリー数が 422,000 (211 x 2000) である map2 BackingMap に使用されます。LRU Evictor と LFU Evictor はいずれもスリープ時間プロパティーを持ちます。 このプロパティーは、ウェイクアップしてエントリーを除去する必要があるかどうかを検査するまで Evictor がスリープする時間を示します。 スリープ時間は、秒単位で指定されます。値 15 秒は、パフォーマンスの影響と BackingMap が大きくなりすぎないようにするための妥当な値です。 目標は、BackingMap のサイズが超過することなく、できる限り長いスリープ時間を使用することです。
setNumberOfLRUQueues メソッドは、LRUEvictor プロパティーを設定します。 このプロパティーは、LRU 情報を管理するために Evictor が使用する LRU キューの数を示します。 各エントリーが同じキュー内の LRU 情報を保持しないように、キューのコレクションを使用します。 この方法により、同じキュー・オブジェクトで同期化する必要があるマップ・エントリーの数が最小化され、 パフォーマンスが向上します。 キューの数を増やすのは、LRU Evictor がパフォーマンスに与えるインパクトを最小化するための良い方法です。 開始点としては、キューの数として最大エントリー数の 10 % を使用することが適切です。 一般に、基本数以外を使用するよりも、基本数を使用するほうが適しています。 setMaxSize メソッドは、各キューに許可されるエントリー数を指定します。キューがその最大エントリー数に達すると、キュー内の最も使用頻度の少ない 1 つまたは複数のエントリーが、次回に Evictor がエントリーを除去する必要があるかどうかをチェックした時点で除去されます。
setNumberOfHeaps メソッドは、LFUEvictor プロパティーを設定します。 このプロパティーは、LFU 情報を管理するために LFUEvictor が使用するバイナリー・ヒープ・オブジェクトの数を設定します。 この場合も、コレクションを使用するとパフォーマンスが向上します。 開始点としては、最大エントリー数の 10% を使用することが適切であり、 一般に、基本数以外を使用するよりも、基本を使用するほうが適しています。 setMaxSize メソッドは、各ヒープに許可されるエントリー数を指定します。ヒープがその最大エントリー数に達すると、ヒープ内の最も使用頻度の低い 1 つまたは複数のエントリーが、次回に Evictor がエントリーを除去する必要があるかどうかをチェックした時点で除去されます。