Integración de SessionHandle

Un objeto SessionHandle incluye la información de partición de la sesión a la que está enlazado y facilita el direccionamiento de solicitudes. Los objetos SessionHandle se aplican solo al escenario de colocación de partición por contenedor.

Objeto SessionHandle para direccionamiento de solicitudes

Puede enlazar un objeto SessionHandle a una sesión de las formas siguientes:

Consejo: En cada una de los siguientes llamadas a método, una vez que se enlaza un objeto SessionHandle a una sesión, se puede obtener el objeto SessionHandle del método Session.getSessionHandle.
  • Llamar al método Session.getSessionHandle: cuando se llama al método, si no hay ningún objeto SessionHandle enlazado a la sesión, se selecciona aleatoriamente un objeto SessionHandle y se enlaza a la sesión.
  • Llamar a las operaciones de transacción de crear, leer, actualizar y suprimir: cuando se llama a estos métodos o durante la confirmación, si no hay ningún objeto SessionHandle enlazado a la sesión, se selecciona aleatoriamente un objeto SessionHandle y se enlaza a la sesión.
  • Llamar al método ObjectMap.getNextKey: cuando se llama a este método, si no hay ningún objeto SessionHandle enlazado a la sesión, se direcciona aleatoriamente la solicitud de operación a particiones individuales hasta que se obtiene una clave. Si se devuelve una clave de una partición, un objeto SessionHandle correspondiente a esa partición se enlaza con la sesión. Si no se encuentra ninguna clave, no se enlaza ningún SessionHandle a la sesión.
  • Llamar a los métodos QueryQueue.getNextEntity o QueryQueue.getNextEntities: en el momento de llamar a este método, si no hay ningún objeto SessionHandle enlazado a la sesión, la solicitud de operación se direcciona aleatoriamente a particiones individuales hasta que se obtiene un objeto. Si se devuelve un objeto de una partición, un objeto SessionHandle correspondiente a esa partición se enlaza a la sesión. Si no se encuentra ningún objeto, no se enlaza ningún SessionHandle con la sesión.
  • Establecer un SessionHandle con el método Session.setSessionHandle(SessionHandle sh): si se obtiene un SessionHandle del método Session.getSessionHandle, el SessionHandle se puede enlazar a una sesión. El establecimiento de un SessionHandle afecta al direccionamiento de solicitudes en el ámbito de la sesión a la que se enlaza.

El método Session.getSessionHandle siempre devuelve un objeto SessionHandle. El método enlaza automáticamente un SessionHandle en la sesión si no hay ningún objeto SessionHandle enlazado a la sesión. Si desea verificar si una sesión tiene solo un objeto SessionHandle, llame al método Session.isSessionHandleSet. Si este método devuelve un valor de false, no hay ningún objeto SessionHandle enlazado actualmente a la sesión.

Tipos de operación principales en el escenario de colocación por contenedor

A continuación se muestra un resumen del comportamiento del direccionamiento de los principales tipos de operación en el escenario de colocación por contenedor respecto a los objetos SessionHandle.

  • Objeto de sesión con objeto SessionHandle enlazado
    • Index - API MapIndex y MapRangeIndex: SessionHandle
    • Query y ObjectQuery: SessionHandle
    • Agent - API MapGridAgent y ReduceGridAgent: SessionHandle
    • ObjectMap.Clear: SessionHandle
    • ObjectMap.getNextKey: SessionHandle
    • QueryQueue.getNextEntity, QueryQueue.getNextEntities: SessionHandle
    • Operaciones de transacción de crear, recuperar, actualizar y suprimir (API ObjectMap y API EntityManager): SessionHandle
  • Objeto de sesión sin objeto SessionHandle enlazado
    • Index - API MapIndex y MapRangeIndex: Todas las particiones activas actuales
    • Query y ObjectQuery: partición especificada con método setPartition de Query y ObjectQuery
    • Agent - MapGridAgent y ReduceGridAgent
      • No soportados: Método ReduceGridAgent.reduce(Session s, ObjectMap map, Collection keys) y MapGridAgent.process(Session s, ObjectMap map, Object key).
      • Todas las particiones activas actuales: Método ReduceGridAgent.reduce(Session s, ObjectMap map) y MapGridAgent.processAllEntries(Session s, ObjectMap map).
    • ObjectMap.clear: Todas las particiones activas actuales.
    • ObjectMap.getNextKey: enlaza un SessionHandle a la sesión si se devuelve una clave de una de las particiones seleccionadas aleatoriamente. Si no se devuelve ninguna clave, la sesión no se enlaza a un SessionHandle.
    • QueryQueue: Especifica una partición con el método QueryQueue.setPartition. Si no se establece ninguna partición, el método selecciona aleatoriamente un partición para devolverla. Si se devuelve un objeto, la sesión actual se enlaza al SessionHandle que se enlaza a la partición que devuelve el objeto. Si no se devuelve ningún objeto, la sesión no se enlaza a un SessionHandle.
    • Operaciones de transacción de crear, recuperar, actualizar y suprimir (API ObjectMap y API EntityManager): Seleccionar aleatoriamente una partición.

    En la mayoría de los casos, utilice SessionHandle para controlar el direccionamiento a una partición determinada. Puede recuperar y almacenar en memoria caché el SessionHandle de la sesión que inserta datos. Después de almacenar en memoria caché el SessionHandle, puede establecerlo en otra sesión, de forma que puede direccionar las solicitudes a la partición especificada por el SessionHandle almacenado en memoria caché. Para realizar operaciones como por ejemplo ObjectMap.clear sin SessionHandle, puede establecer temporalmente el SessionHandle en nulo llamando a Session.setSessionHandle(null). Sin un SessionHandle especificado, las operaciones se ejecutan en todas las particiones activas actuales.

  • Comportamiento de direccionamiento de QueryQueue

    En el escenario de colocación de particiones por contenedor, puede utilizar SessionHandle para controlar el direccionamiento de los métodos getNextEntity y getNextEntities de la API QueryQueue. Si la sesión está enlazada a un SessionHandle, las solicitudes se direccionan a la partición a la que está enlazado el SessionHandle. Si la sesión no se enlaza a SessionHandle, las solicitudes se direccionan a la partición establecida con el método QueryQueue.setPartition si la partición se ha establecido de esta forma. Si la sesión no tiene ningún SessionHandle o partición enlazados, se devuelve una partición seleccionada aleatoriamente. Si no se encuentra este tipo de partición, el proceso se detiene y no se enlaza ningún and no SessionHandle a la sesión actual.

El siguiente fragmento de código muestra cómo utilizar el objeto SessionHandle.

Session ogSession = objectGrid.getSession();

// enlazando SessionHandle
SessionHandle sessionHandle = ogSession.getSessionHandle();

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

// la transacción se direcciona a la partición especificada por SessionHandle
ogSession.commit();
// almacenar en memoria caché el SessionHandle que inserta datos
SessionHandle cachedSessionHandle = ogSession.getSessionHandle();

// verificar si SessionHandle está definido en la sesión
boolean isSessionHandleSet = ogSession.isSessionHandleSet();

// desenlazar temporalmente el SessionHandle de la sesión
if(isSessionHandleSet) {
    ogSession.setSessionHandle(null);
} 

// si la sesión no tiene ningún SessionHandle enlazado, la operación
// de borrado se ejecutará en todas las particiones activas actualmente
// y, de este modo, eliminará todos los datos de la correlación en toda
// la cuadrícula
map.clear();

// después de realizar el borrado, restablecer el SessionHandle, si
// la sesión necesita utilizar el SessionHandle anterior.
// Opcionalmente, al llamar a getSessionHandle se puede obtener un
// SessionHandle nuevo
ogSession.setSessionHandle(cachedSessionHandle);

Consideraciones sobre el diseño de aplicaciones

En el escenario de la estrategia de colocación por contenedor, utilice el objeto SessionHandle para la mayoría de operaciones. El objeto SessionHandle controla el direccionamiento a las particiones. Para recuperar datos, el objeto SessionHandle que se enlaza a la sesión debe ser el mismo objeto SessionHandle de cualquier transacción de inserción de datos.

Cuando desee realizar una operación sin un SessionHandle establecido en la sesión, puede desenlazar un SessionHandle de una sesión realizando una llamada al método Session.setSessionHandle(null).

Cuando se enlaza una sesión a un SessionHandle, todas las solicitudes de la operación se direccionan a la partición especificada por el objeto SessionHandle. Sin el objeto SessionHandle establecido, las operaciones se direccionan a todas las operaciones o a una partición seleccionada aleatoriamente.