SessionHandle 統合

SessionHandle オブジェクトにはバインドされているセッションの区画情報が含まれ、ルーティングの要求が容易になります。SessionHandle オブジェクトは、コンテナーごとの区画配置のシナリオにのみ適用されます。

ルーティング要求のための SessionHandle オブジェクト

次の方法で、SessionHandle オブジェクトをセッションにバインドすることができます。

ヒント: 以下の各メソッド呼び出しで、SessionHandle オブジェクトがセッションにバインドされると、SessionHandle オブジェクトを Session.getSessionHandle メソッドから取得できます。
  • Session.getSessionHandle メソッドの呼び出し: このメソッドが呼び出されたときに、SessionHandle オブジェクトがセッションにバインドされていない場合、SessionHandle オブジェクトはランダムに選択されてセッションにバインドされます。
  • トランザクションの作成、読み取り、更新、削除操作の呼び出し: これらのメソッドが呼び出されたとき、またはコミット時に SessionHandle オブジェクトがセッションにバインドされていない場合は、SessionHandle オブジェクトはランダムに選択されてセッションにバインドされます。
  • ObjectMap.getNextKey メソッドの呼び出し: このメソッドが呼び出されたときに、SessionHandle オブジェクトがセッションにバインドされていない場合、操作要求はキーが取得されるまで個々の区画にランダムに送付されます。キーが区画から戻されると、その区画に対応する SessionHandle オブジェクトがセッションにバインドされます。 キーが見つからなかった場合は、SessionHandle はセッションにバインドされません。
  • QueryQueue.getNextEntity または QueryQueue.getNextEntities メソッドの呼び出し: このメソッドが呼び出されたときに、SessionHandle オブジェクトがセッションにバインドされていない場合、操作要求はオブジェクトが取得されるまで個々の区画にランダムに送付されます。オブジェクトが区画から戻されると、その区画に対応する SessionHandle オブジェクトがセッションにバインドされます。 オブジェクトが見つからなかった場合は、SessionHandle はセッションにバインドされません。
  • Session.setSessionHandle(SessionHandle sh) メソッドを使用した SessionHandle の設定: SessionHandleSession.getSessionHandle メソッドから取得すると、SessionHandle をセッションにバインドできます。 SessionHandle の設定は、バインドされているセッションの有効範囲内でのルーティングの要求に影響します。

Session.getSessionHandle メソッドは、常に SessionHandle オブジェクトを戻します。また、SessionHandle オブジェクトがセッションにバインドされていない場合、このメソッドはセッション上の SessionHandle も自動的にバインドします。セッションに SessionHandle オブジェクトがあるかどうかを確認するだけであれば、Session.isSessionHandleSet メソッドを呼び出してください。このメソッドが値 false を戻す場合は、SessionHandle オブジェクトは現在セッションにバインドされていません。

コンテナーごとの配置のシナリオにおける主要な操作タイプ

SessionHandle オブジェクトに関して、コンテナーごとの区画配置のシナリオにおける主要な操作タイプのルーティングの振る舞いの要約は、次のとおりです。

  • バインドされた SessionHandle オブジェクトを使用したセッション・オブジェクト
    • 索引 - MapIndex API および MapRangeIndex API: SessionHandle
    • Query および ObjectQuery: SessionHandle
    • エージェント - MapGridAgent および ReduceGridAgent API: SessionHandle
    • ObjectMap.Clear: SessionHandle
    • ObjectMap.getNextKey: SessionHandle
    • QueryQueue.getNextEntity、QueryQueue.getNextEntities: SessionHandle
    • トランザクションの作成、取得、更新、および削除操作 (ObjectMap API および EntityManager API): SessionHandle
  • バインドされた SessionHandle オブジェクトを使用しないセッション・オブジェクト
    • 索引 - MapIndex API および MapRangeIndex API: すべての現行アクティブ区画
    • Query および ObjectQuery: Query および ObjectQuery の setPartition メソッドを使用して指定された区画
    • エージェント - MapGridAgent および ReduceGridAgent
      • サポートなし: ReduceGridAgent.reduce(Session s, ObjectMap map, Collection keys) メソッドおよび MapGridAgent.process(Session s, ObjectMap map, Object key) メソッド。
      • すべての現行アクティブ区画: ReduceGridAgent.reduce(Session s, ObjectMap map) メソッドおよび MapGridAgent.processAllEntries(Session s, ObjectMap map) メソッド。
    • ObjectMap.clear: すべての現行アクティブ区画。
    • ObjectMap.getNextKey: ランダムに選択された区画の 1 つからキーが戻される場合は SessionHandle をセッションにバインドします。 キーが戻されない場合は、セッションは SessionHandle にバインドされません。
    • QueryQueue: QueryQueue.setPartition メソッドを使用して区画を指定します。 区画が設定されていない場合、メソッドは戻す区画をランダムに選択します。 オブジェクトが戻されると、現行セッションは、オブジェクトを戻した区画にバインドされている SessionHandle にバインドされます。 オブジェクトが戻されない場合、セッションは SessionHandle にバインドされません。
    • トランザクションの作成、取得、更新、および削除操作 (ObjectMap API および EntityManager API): 区画をランダムに選択します。

    ほとんどの場合、SessionHandle を使用して特定の区画へのルーティングを制御します。データを挿入するセッションから SessionHandle を取得してキャッシュに入れることができます。 SessionHandle をキャッシュに入れた後、それを別のセッション上で設定することができるので、キャッシュに入れられた SessionHandle が指定する区画に要求を送付できます。 SessionHandle を使用しないで ObjectMap.clear などの操作を実行するには、Session.setSessionHandle(null) を呼び出して一時的に SessionHandle をヌルに設定します。SessionHandle を指定しないと、操作はすべての現行アクティブ区画で実行されます。

  • QueryQueue ルーティングの振る舞い

    コンテナーごとの区画配置のシナリオでは、SessionHandle を使用して QueryQueue API の getNextEntity メソッドおよび getNextEntities メソッドのルーティングを制御することができます。 セッションが SessionHandle にバインドされている場合、要求は SessionHandle がバインドされている区画に送付されます。 セッションが SessionHandle にバインドされていない場合は、区画がこのような方法で設定されていなければ、QueryQueue.setPartition メソッドで設定された区画に要求が送付されます。 セッションにバインドされた SessionHandle または区画がない場合、ランダムに選択された区画が戻されます。 このような区画が見つからない場合は、プロセスは停止し、SessionHandle は現行セッションにバインドされません。

以下のコード・スニペットは、SessionHandle オブジェクトの使用方法を示しています。

Session ogSession = objectGrid.getSession();

// binding the SessionHandle
SessionHandle sessionHandle = ogSession.getSessionHandle();

ogSession.begin();
ObjectMap map = ogSession.getMap("planet");
map.insert("planet1", "mercury");

// transaction is routed to partition specified by SessionHandle
ogSession.commit();

// cache the SessionHandle that inserts data
SessionHandle cachedSessionHandle = ogSession.getSessionHandle();

// verify if SessionHandle is set on the Session
boolean isSessionHandleSet = ogSession.isSessionHandleSet();

// temporarily unbind the SessionHandle from the Session
if(isSessionHandleSet) {
    ogSession.setSessionHandle(null);
} 

// if the Session has no SessionHandle bound, 
// the clear operation will run on all current active partitions
// and thus remove all data from the map in the entire grid
map.clear();

// after clear is done, reset the SessionHandle back, 
// if the Session needs to use previous SessionHandle.
// Optionally, calling getSessionHandle can get a new SessionHandle
ogSession.setSessionHandle(cachedSessionHandle);

アプリケーション設計に関する考慮事項

コンテナーごとの配置ストラテジーのシナリオでは、ほとんどの操作に対して SessionHandle オブジェクトを使用します。 SessionHandle オブジェクトは、区画へのルーティングを制御します。 データを取得するために、セッションにバインドする SessionHandle オブジェクトは、どの挿入データ・トランザクションからも同じ SessionHandle オブジェクトでなければなりません。

セッション上に設定された SessionHandle を使用せずに操作を実行するには、Session.setSessionHandle(null) メソッド呼び出しを行って、SessionHandle をセッションからアンバインドします。

セッションが SessionHandle にバインドされているときは、SessionHandle オブジェクトで指定された区画にすべての操作要求が送付されます。SessionHandle オブジェクトを設定しないと、すべての区画またはランダムに選択された区画のどちらかに操作は送付されます。