10.2. エビクションリージョン
マーシャリングでは、 リージョンの概念と
Region
クラスは 「クラスローディングとリージョン」 でした。 リージョン内のノードのエビクション動作を定義するためにもリージョンは使用されます。 リージョン固有の設定を使用するだけでなく、 特定のリージョンを定義しなくない場合や、 事前定義されたリージョンに属さないノードに対してデフォルトのキャッシュ全体のエビクション動作を設定することもできます。 設定 XML ファイルを使用してリージョンを定義する場合、 リージョンを定義する Fqn
の全要素は String
オブジェクトになります。
各リージョンに対してエビクションパラメータを定義することができます。
重複するリージョンを定義することも可能です。 例えば、 1 つのリージョンを
/a/b/c
に定義し 、別のリージョンを /a/b/c/d
(/a/b/c
サブツリーの d サブツリー) に定義することが可能です。 アルゴリズムはこのような例を一貫して処理するため、 常に最初に遭遇したリージョンを選択します。 そのため、 ノード /a/b/c/d/e
の処理方法をアルゴリズムが決定する必要がある場合 、定義されたリージョンを最初に見つけるまでツリーを上がります (この例の場合は /a/b/c/d
)。
10.2.1. 常駐ノード
エビクションをトリガするか確認する時と実際にノードのエビクションを開始する時、 常駐と示されているノード (
Node.setResident()
API を使用) はエビクションポリシーによって無視されます。 例えば、 リージョンの最大ノード数が 10 に設定されている場合、 そのリージョンでノードをエビクトするか判定する際に常駐ノードは数に含まれません。 また、 リージョンのエビクションがしきい値に達した時、 常駐ノードはエビクションの対象として考慮されません。
ノードを常駐とするには、
Node.setResident()
API を使用する必要があります。 デフォルトでは、 新規作成されたノードは常駐ノードにはなりません。 ノードの resident
属性はレプリケートや永続化できず、 トランザクションを意識しません。
次の常駐ノードのユースケースは、 「パス」ノードがエビクションポリシーに「雑音」を追加しないようにします。
... Map lotsOfData = generateData(); cache.put("/a/b/c", lotsOfData); cache.getRoot().getChild("/a").setResident(true); cache.getRoot().getChild("/a/b").setResident(true); ...
この例では、
/a
ノードと /a/b
ノードはパスで、 /a/b/c
ノードの存在をサポートするためのみに存在し、 データは保有しません。 そのため、 常駐ノードとするのに最適です。 /a
や /a/b
へアクセスする際にエビクションイベントが生成されないため、 メモリ管理が向上されます。
注記
常駐ノードへ属性を追加する場合 (上記の例では
cache.put("/a", "k", "v")
)、 常駐ノードを非常駐ノードに戻し、 エビクションの対象となるようにしてください。