動的マップを使用すると、データ・グリッドが既に初期化された後にマップを作成できます。
前のバージョンの WebSphere® eXtreme Scale では、ObjectGrid を初期化する前にマップを定義する 必要がありました。その結果として、使用されるすべてのマップを、いずれかのマップに対してトランザクションを 実行する前に、作成しておく必要がありました。
動的マップの導入によって、 初期化の前にすべてのマップを定義しなければならないという制約が 軽減されました。テンプレート・マップの使用を通して、ObjectGrid が初期化された 後にマップを作成できます。
テンプレート・マップ は、ObjectGrid XML ファイル内に定義されます。前もって定義されていないマップをセッションが要求 すると、テンプレート比較が実行されます。新規マップ名と、いずれかのテンプレート・マップの正規表現が一致する 場合、動的にマップが作成され、要求されたマップの名前が 割り当てられます。この新しく作成されたマップは、ObjectGrid XML ファイルで定義されたテンプレート・マップの 設定のすべてを継承します。
動的マップ作成 は、Session.getMap(String) メソッドと結びついています。 このメソッドを呼び出すと、ObjectGrid XML ファイルによって構成された BackingMap に 基づいて ObjectMap が戻されます。
いずれかのテンプレート・マップの正規表現に一致するストリングを 渡すと、ObjectMap および関連する BackingMap が作成 されるという結果になります。
Session.getMap(String cacheName) メソッドについて詳しくは、API 資料を参照してください。
XML 内でのテンプレート・マップ の定義は、backingMap エレメントに template ブール値属性を設定するだけ の単純さです。template が true に設定されている backingMap の 名前は、正規表現であると解釈されます。
WebSphere eXtreme Scale は Java 正規表現 パターン・マッチングを使用します。Java での正規表現エンジンに ついて詳しくは、java.util.regex パッケージおよびクラス関する API 資料を参照してください。
テンプレート・マップが 1 つ定義 されたサンプル ObjectGrid XML ファイルを以下に示します。
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
xmlns="http://ibm.com/ws/objectgrid/config">
<objectGrids>
<objectGrid name="accounting">
<backingMap name="payroll" readOnly="false" />
<backingMap name="templateMap.*" template="true"
pluginCollectionRef="templatePlugins" lockStrategy="PESSIMISTIC" />
</objectGrid>
</objectGrids>
<backingMapPluginCollections>
<backingMapPluginCollection id="templatePlugins">
<bean id="Evictor"
className="com.ibm.websphere.objectgrid.plugins.builtins.LFUEvictor" />
</backingMapPluginCollection>
</backingMapPluginCollections>
</objectGridConfig>
上記の XML ファイルは、1 つの テンプレート・マップと 1 つの非テンプレート・マップを定義しています。テンプレート・マップの 名前は正規表現 templateMap.* です。この正規表現 と一致するマップ名を指定して Session.getMap(String) メソッド が呼び出された場合、アプリケーションはマップを 作成します。
動的マップを作成するために、テンプレート・マップの構成が 必要です。ObjectGrid XML ファイル内で backingMap に template ブール値を 追加します。
<backingMap name="templateMap.*" template="true" />
このテンプレート・マップの 名前は、正規表現として扱われます。
この正規表現に一致する cacheName を 指定して Session.getMap(String cacheName) メソッドを 呼び出すと、動的マップが作成されるという結果になります。このメソッド呼び出しで 1 つの ObjectMap オブジェクト が戻され、関連する BackingMap オブジェクトが作成されます。
Session session = og.getSession();
ObjectMap map = session.getMap("templateMap1");
新しく 作成されたマップは、テンプレート・マップ定義に定義されたすべての属性およびプラグインを使用して 構成されます。前の ObjectGrid XML ファイルについてもう一度考えてみてください。
この XML ファイル中のテンプレート・マップ をベースにして作成される動的マップにはエビクターが構成され、 ロック・ストラテジーはペシミスティックになります。
テンプレート・マップを使用 する際には、Session.getMap(String cacheName) メソッドの動作における変更点を 考慮してください。WebSphere eXtreme Scale バージョン 7.0 より以前のバージョンで は、Session.getMap(String cacheName) メソッドの 呼び出しはすべて、要求されたマップが存在していなければ UndefinedMapException 例外 という結果になりました。動的マップでは、テンプレート・マップの正規表現に一致する名前であれば、 マップが作成される結果になります。特に正規表現が総称である場合は、アプリケーションが作成するマップの数に 注意するようにしてください。
また、eXtreme Scale セキュリティーが有効にされている場合は、動的マップ作成には ObjectGridPermission.DYNAMIC_MAP が 必要です。この許可は Session.getMap(String) メソッドが呼び出された ときにチェックされます。詳しくは、アプリケーション・クライアントの許可を参照してください。
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
xmlns="http://ibm.com/ws/objectgrid/config">
<objectGrids>
<objectGrid name="session">
<backingMap name="objectgrid.session.metadata.dynamicmap.*" template="true"
lockStrategy="PESSIMISTIC" ttlEvictorType="LAST_ACCESS_TIME">
<backingMap name="objectgrid.session.attribute.dynamicmap.*"
template="true" lockStrategy="OPTIMISTIC"/>
<backingMap name="datagrid.session.global.ids.dynamicmap.*"
lockStrategy="PESSIMISTIC"/>
</objectGrid>
</objectGrids>
</objectGridConfig>
<?xml version="1.0" encoding="UTF-8"?>
<deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/deploymentPolicy
../deploymentPolicy.xsd"
xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy">
<objectgridDeployment objectgridName="session">
<mapSet name="mapSet2" numberOfPartitions="5" minSyncReplicas="0"
maxSyncReplicas="0" maxAsyncReplicas="1" developmentMode="false"
placementStrategy="PER_CONTAINER">
<map ref="logical.name"/>
<map ref="objectgrid.session.metadata.dynamicmap.*"/>
<map ref="objectgrid.session.attribute.dynamicmap.*"/>
<map ref="datagrid.session.global.ids"/>
</mapSet>
</objectgridDeployment>
</deploymentPolicy>