Intégration SessionHandle

Un objet SessionHandle contient les informations de partition de la session à laquelle il est lié et facilite le routage des demandes. Les objets SessionHandle s'appliquent au scénario de placement de partition par conteneur uniquement.

Objet SessionHandle du routage des demandes

Vous pouvez lier un objet SessionHandle à une session des manières suivantes :

Conseil : Dans chacun des appels de méthode suivants après qu'un objet SessionHandle est lié à une session, l'objet SessionHandle peut être obtenu à partir de la méthode Session.getSessionHandle.
  • Appelez la méthode Session.getSessionHandle : lorsque cette méthode est appelée, si aucun objet SessionHandle n'est lié à la session, un objet SessionHandle est sélectionné de façon aléatoire et lié à la session.
  • Appelez les opérations de création, de lecture, de mise à jour, de suppression transactionnelles : lorsque ces méthodes sont appelées ou lors de la validation, si aucun objet SessionHandle n'est lié à la session, un objet SessionHandle est sélectionné de manière aléatoire et lié à la session.
  • Appelez la méthode ObjectMap.getNextKey : lorsque cette méthode est appelée, si aucun objetSessionHandle n'est lié à la session, la demande d'opération est acheminée de façon aléatoire vers les partitions individuelles jusqu'à ce qu'une clé soit obtenue. Si une clé est renvoyée par une partition, un objet SessionHandle correspondant à cette partition est lié à la session. Si aucune clé n'est trouvée, aucun objet SessionHandle n'est lié à la session.
  • Appelez la méthode QueryQueue.getNextEntity ou QueryQueue.getNextEntities : lorsque cette méthode est appelée, si aucun objet SessionHandle n'est lié à la session, la demande d'opération est acheminée de façon aléatoire vers les partitions individuelles jusqu'à ce qu'un objet soit obtenu. Si un objet est renvoyé par une partition, un objet SessionHandle correspondant à cette partition est lié à la session. Si aucun objet n'est trouvé, aucun objet SessionHandle n'est lié à la session.
  • Définissez un objet SessionHandle avec la méthode Session.setSessionHandle(SessionHandle sh) : si un objet SessionHandle est obtenu de la méthode Session.getSessionHandle, l'objet SessionHandle peut être lié à une session. La définition d'un objet SessionHandle a un impact sur le routage des demandes dans la portée de la session à laquelle il est lié.

La méthode Session.getSessionHandle renvoie toujours un objet SessionHandle. La méthode lie également automatiquement un objet SessionHandle dans la session si aucun objet SessionHandle n'est lié à la session. Si vous souhaitez vérifier si une session comporte un objet SessionHandle uniquement, appelez la méthode Session.isSessionHandleSet. Si cette méthode renvoie la valeur false, cela implique qu'aucun objet SessionHandle n'est actuellement lié à la session.

Principaux types d'opérations dans le scénario de positionnement par conteneur

Vous trouverez ci-après le résumé du comportement de routage des principaux types d'opérations dans le scénario de placement de partition par conteneur concernant les objets SessionHandle .

  • Objet de session avec objet lié SessionHandle
    • Index - MapIndex et API MapRangeIndex : SessionHandle
    • Query et ObjectQuery : SessionHandle
    • Agent - MapGridAgent et API ReduceGridAgent : SessionHandle
    • ObjectMap.Clear : SessionHandle
    • ObjectMap.getNextKey : SessionHandle
    • QueryQueue.getNextEntity, QueryQueue.getNextEntities : SessionHandle
    • Opérations de création, d'extraction, de mise à jour et de suppression transactionnelles (API ObjectMap et API EntityManager) : SessionHandle
  • Objet de session sans objet lié SessionHandle
    • Index - MapIndex et API MapRangeIndex : toutes les partitions actives
    • Query et ObjectQuery : partition spécifiée avec la méthode setPartition de Query et ObjectQuery
    • Agent - MapGridAgent et ReduceGridAgent
      • Non pris en charge : méthodes ReduceGridAgent.reduce(Session s, ObjectMap map, Collection keys) et MapGridAgent.process(Session s, ObjectMap map, Object key).
      • Toutes les méthodes actives : méthodes ReduceGridAgent.reduce(Session s, ObjectMap map) et MapGridAgent.processAllEntries(Session s, ObjectMap map).
    • ObjectMap.clear : toutes les partitions actives.
    • ObjectMap.getNextKey : lie un objet SessionHandle à la session si une clé est renvoyée d'une des partitions sélectionnées de façon aléatoire. Si aucune clé n'est envoyée, la session n'est pas liée à un objet SessionHandle.
    • QueryQueue : spécifie une partition avec la méthode QueryQueue.setPartition. Si aucune partition n'est définie, la méthode aléatoire sélectionne une partition à renvoyer. Si un objet est renvoyé, la session actuelle est liée à l'objet SessionHandle qui est lié à la partition renvoyant l'objet. Si aucun objet n'est envoyé, la session n'est pas liée à un objet SessionHandle.
    • Opérations de création, d'extraction, de mise à jour et de suppression transactionnelles (API ObjectMap et API EntityManager) : sélection aléatoire d'une partition.

    Dans la plupart des cas, utilisez SessionHandle pour contrôler le routage vers une partition particulière. Vous pouvez extraire et mettre en cache l'objet SessionHandle de la session qui insère les données. Après la mise en cache de SessionHandle, vous pouvez le définir dans une autre session pour acheminer les demandes vers la partition spécifiée par l'objet SessionHandle mis en cache. Pour effectuer des opérations, telles que ObjectMap.clear sans SessionHandle, vous pouvez temporairement affecter à SessionHandle la valeur null en appelant Session.setSessionHandle(null). Sans un objet SessionHandle, les opérations sont exécutées dans toutes les partitions actives.

  • Comportement de routage QueryQueue

    Dans le scénario de placement de la partition par conteneur, vous pouvez utiliser SessionHandle pour contrôler le routage des méthodes getNextEntity et getNextEntities de l'API QueryQueue. Si la session est liée à un objet SessionHandle, les demandes sont acheminées vers la partition à laquelle l'objet SessionHandle est lié. Si la session n'est pas liée à un objet SessionHandle, les demandes sont acheminées vers la partition définie à l'aide de la méthode QueryQueue.setPartition si une partition a été définie de cette manière. Si la session n'a pas d'objet SessionHandle ou de partition liés, une partition sélectionnée de manière aléatoire est renvoyée. Si aucune partition n'est trouvée, le processus s'interrompt et aucun objet SessionHandle n'est lié à la session actuelle.

Le fragment de code suivant montre comment utiliser les objets SessionHandle.

Session ogSession = objectGrid.getSession();

// liaison du SessionHandle
SessionHandle sessionHandle = ogSession.getSessionHandle();

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

// transaction est acheminée vers la répartition spécifiée par SessionHandle
ogSession.commit();

// met en cache SessionHandle qui insère des données
SessionHandle cachedSessionHandle = ogSession.getSessionHandle();

// vérifiez si SessionHandle est défini sur la session
boolean isSessionHandleSet = ogSession.isSessionHandleSet();

// déconnecte temporairement SessionHandle de la session
if(isSessionHandleSet) {
    ogSession.setSessionHandle(null);
} 

// si la session n'est liée à aucun SessionHandle, 
// l'opération clear s'exécute sur toutes les partitions actives
// et supprime toutes les données de la mappe dans l'ensemble de la grille
map.clear();

// après l'opération clear, réinitialisez SessionHandle, 
// si la session doit utiliser le SessionHandle précédent.
// Eventuellement l'appel de getSessionHandle peut provoquer un nouveau SessionHandle
ogSession.setSessionHandle(cachedSessionHandle);

Considérations liées à la conception d'applications

Dans le scénario de stratégie de placement par conteneur, utilisez l'objet SessionHandle pour la plupart des opérations. L'objet SessionHandle contrôle le routage vers les partitions. Pour extraire des données, l'objet SessionHandle que vous liez à la session doit correspondre à l'objet SessionHandle d'une transaction de données d'insertion.

Lorsque vous voulez effectuer une opération sans objet SessionHandle défini dans la session, vous pouvez déconnecter un objet SessionHandle d'une session en exécutant un appel de méthode Session.setSessionHandle(null).

Lorsqu'une session est liée à un objet SessionHandle, toutes les demandes d'opérations sont acheminées vers la partition spécifiée par l'objet SessionHandle. Sans l'objet SessionHandle défini, les opérations routent les demandes vers toutes les partitions ou une partition sélectionnée de manière aléatoire.