ObjectMap インターフェースは、アプリケーションと BackingMap との間のトランザクション対話のために使用されます。
目的
ObjectMap インスタンスが、現行スレッドと対応するセッション・オブジェクトから獲得されます。
ObjectMap インターフェースは、BackingMap 内のエントリーを変更するためにアプリケーションが使用するメイン媒体です。
ObjectMap インスタンスの取得
アプリケーションは、
Session.getMap(String) メソッドを使用して、セッション・オブジェクトから ObjectMap インスタンスを取得します。
以下のコード・スニペットは、ObjectMap インスタンスの獲得方法を示すものです。
ObjectGrid objectGrid = ...;
BackingMap backingMap = objectGrid.defineMap("mapA");
Session sess = objectGrid.getSession();
ObjectMap objectMap = sess.getMap("mapA");
各 ObjectMap インスタンスは、特定のセッション・オブジェクトと対応しています。
特定のセッション・オブジェクトで同じ BackingMap 名を使用して
getMap メソッドを複数回呼び出すと、常に同じ ObjectMap インスタンスが戻されます。
トランザクションの自動コミット
ObjectMap と JavaMap を使用する BackingMap に対する操作は、セッション・トランザクション内では非常に効率よく実行されます。ObjectMap インターフェースおよび JavaMap インターフェース上のメソッドがセッション・トランザクションの外部で呼び出される場合、WebSphere® eXtreme
Scale は、自動コミット・サポートを提供します。メソッドは、暗黙のトランザクションを開始し、要求された操作を実行し、その暗黙のトランザクションをコミットします。
メソッドのセマンティクス
以下で、ObjectMap インターフェースおよび JavaMap インターフェース上の各メソッドの背後にあるセマンティクスについて説明します。
- containsKey メソッド
- containsKey メソッドは、キーが BackingMap または Loader に値を持っているかどうかを判別します。アプリケーションが NULL 値をサポートしている場合は、このメソッドは get 操作から戻された NULL 参照が NULL 値を参照しているのか、
BackingMap および Loader がキーを含んでいないことを示すのかを判別するために使用できます。
- flush メソッド
- flush メソッドのセマンティクスは、Session インターフェース上の flush メソッドと似ています。注意すべき相違点は、セッション・フラッシュが、現行セッション内で変更されたすべてのマップの現行の保留変更点を適用するということです。
このメソッドを使用すると、この ObjectMap インスタンスでの変更のみがローダーにフラッシュされます。
- get メソッド
- get メソッドは、BackingMap インスタンスからエントリーをフェッチします。BackingMap インスタンス内でエントリーが検出されず、Loader が BackingMap インスタンスと関連付けられている場合、BackingMap インスタンスは、Loader からエントリーをフェッチしようとします。getAll メソッドは、バッチ・フェッチ処理を可能にするために提供されています。
- getForUpdate メソッド
- getForUpdate メソッドは get メソッドと同じですが、getForUpdate メソッドを使用すると、BackingMap および Loader に対してエントリーを更新することが目的であることが指示されます。Loader はこのヒントを使用して、データベース・バックエンドに「SELECT for UPDATE」照会を発行できます。
BackingMap にペシミスティック・ロック・ストラテジーが定義されている場合、ロック・マネージャーがエントリーをロックします。getAllForUpdate メソッドは、バッチ・フェッチ処理を可能にするために提供されています。
- insert メソッド
- insert メソッドは、BackingMap および Loader にエントリーを挿入します。このメソッドを使用すると、これまで存在していないエントリーを挿入するということが BackingMap および Loader に通知されます。既存のエントリー上でこのメソッドを起動すると、メソッドが起動されるとき、あるいは現行のトランザクションがコミットされるときに例外が発生します。
- invalidate メソッド
- invalidate メソッドのセマンティクスは、このメソッドに渡される isGlobal パラメーターの値によって決まります。invalidateAll メソッドは、バッチ無効化処理を可能にするために提供されています。
invalidate メソッドの isGlobal パラメーターとして値 false が渡される場合は、ローカル無効化を指定します。ローカル無効化は、トランザクション・キャッシュ内のエントリーへのいかなる変更も破棄します。
アプリケーションが get メソッドを発行した場合、エントリーは BackingMap 内でコミットされた最後の値からフェッチします。
BackingMap 内にエントリーがない場合は、ローダー内で最後にフラッシュされたかまたはコミットされた値から、エントリーが取り出されます。
トランザクションがコミットされるとき、ローカルに無効化されているとマークされたエントリーはいずれも BackingMap に影響を与えません。
ローダーにフラッシュされたすべての変更は、エントリーが無効化された場合であってもコミットされます。
invalidate メソッドの isGlobal パラメーターとして true が渡される場合、グローバル無効化が指定されます。グローバル無効化は、トランザクション・キャッシュ内のエントリーに対するすべての保留中の変更を破棄し、
エントリー上で実行された以降の操作で BackingMap 値をバイパスします。
トランザクションがコミットされているとき、グローバルに無効化されているとマークされたエントリーはいずれも BackingMap から除去されます。
以下の無効化のユース・ケースを例として考えます。
BackingMap が自動増分列を持つデータベース表から戻されます。
増分列はレコードに固有の番号を割り当てるために有効です。
アプリケーションはエントリーを挿入します。
挿入の後で、アプリケーションは挿入された行のシーケンス番号を認識しておく必要があります。
オブジェクトのコピーが古いことが分かると、グローバル無効化を使用して Loader から値を入手します。
以下のコードはこのユース・ケースを説明しています。
Session sess = objectGrid.getSession();
ObjectMap map = sess.getMap("mymap");
sess.begin();
map.insert("Billy", new Person("Joe", "Bloggs", "Manhattan"));
sess.flush();
map.invalidate("Billy", true);
Person p = map.get("Billy");
System.out.println("Version column is: " + p.getVersion());
map.commit();
// Close the session (optional in Version 7.1.1 and later) for improved performance
session.close();
このサンプル・コードは、Billy にエントリーを追加します。
Person のバージョン属性が、データベースの自動増分列を使用して設定されます。
アプリケーションは、最初に挿入コマンドを実行します。次にフラッシュを発行して、挿入を Loader およびデータベースに送信します。
データベースはこのバージョン列をシーケンスの次の番号に設定します。
これによりトランザクション内の Person オブジェクトが期限切れになります。
このオブジェクトを更新するために、アプリケーションがグローバルに無効化されます。
発行される次の get メソッドは、Loader からエントリーを取得し、トランザクションの値を無視します。エントリーは、更新されたバージョン値を持つデータベースから取り出されます。
- put メソッド
- put メソッドのセマンティクスは、前の get メソッドがキーに対するトランザクション内で呼び出されたかどうかに依存します。アプリケーションが BackingMap または Loader 内に存在するエントリーを戻す get 操作を発行する場合、put メソッドの呼び出しは更新として解釈され、トランザクション内の前の値を戻します。前に get メソッドが呼び出されることなく put メソッド呼び出しが実行された場合、または前の get メソッド呼び出しでエントリーが見つからなかった場合、操作は挿入と解釈されます。put 操作がコミットされると、insert メソッドおよび update メソッドのセマンティクスが適用されます。putAll メソッドは、バッチの挿入および更新処理を可能にするために提供されています。
- remove メソッド
- remove メソッドは、BackingMap および Loader (Loader が接続されている場合) からエントリーを除去します。除去されたオブジェクトの値は、このメソッドによって戻されます。
そのオブジェクトが存在していない場合、このメソッドはヌル値を戻します。removeAll メソッドは、戻り値なしでバッチ削除処理を可能にするために提供されています。
- setCopyMode メソッド
- setCopyMode メソッドは、この ObjectMap の CopyMode 値を指定します。このメソッドを使用すると、アプリケーションは、BackingMap 上で指定された CopyMode 値をオーバーライドできます。指定された CopyMode 値は、clearCopyMode メソッドが呼び出されるまで有効になっています。いずれのメソッドも、トランザクションの境界の外側で起動されます。
CopyMode 値は、トランザクションの途中で変更することはできません。
- touch メソッド
- touch メソッドは、エントリーの最終アクセス時間を更新します。このメソッドは、BackingMap からの値を検索しません。
このメソッドは、自身のトランザクション内で使用します。
無効化または除去のために、提供されたキーが BackingMap 内に存在しない場合は、コミット処理中に例外が発生します。
- update メソッド
- update メソッドは、BackingMap および Loader 内のエントリーを明示的に更新します。このメソッドを使用して、BackingMap および Loader に、既存のエントリーを更新することを示します。
存在していないエントリー上でこのメソッドを起動すると、メソッドが起動されるとき、あるいはコミット処理中に例外が発生します。
- getIndex メソッド
- getIndex メソッドは、BackingMap に作成されている名前付き索引を取得しようとします。この索引は、スレッド間で共有することができず、
セッションと同じ規則に基づいて機能します。
戻された索引オブジェクトは、MapIndex インターフェース、MapRangeIndex インターフェース、カスタム索引インターフェースなど、正しいアプリケーション索引インターフェースにキャストする必要があります。
- clear メソッド
- clear メソッドは、すべての区画のマップからすべてのキャッシュ・エントリーを除去します。この操作は、自動コミット機能であるので、clear の呼び出し時には、アクティブ・トランザクションが存在しないようにします。
注: clear メソッドは、その呼び出しが行われたマップのみをクリアし、関連したエンティティー・マップはそのままにしておきます。このメソッドは、Loader プラグインを呼び出しません。