Chaque instance ObjectGrid contient une collection d'objets BackingMap. Les méthodes defineMap ou createMap
de l'interface ObjectGrid permettent de nommer et d'ajouter chaque mappe de sauvegarde
à une instance ObjectGrid. Ces méthodes retournent une instance BackingMap
qui sert alors à définir le comportement de la mappe correspondante. L'on peut considérer les objets BackingMap comme des caches en mémoire
des données validées d'une mappe individuelle.
Interface Session
L'interface Session
sert à commencer une transaction et à obtenir l'ObjectMap ou le JavaMap
requis pour assurer l'interaction transactionnelle entre une application
et un objet BackingMap. Mais les modifications subies par la transaction
ne sont appliquées à l'objet BackingMap qu'après la validation de la transaction. L'on peut considérer les objets BackingMap comme des caches en mémoire
des données validées d'une mappe individuelle. Pour plus d'informations, voir les Utilisation des sessions pour accéder aux données de la grille.
L'interface BackingMap
fournit des méthodes pour la définition des attributs BackingMap. Certaines des méthodes set
apporte une extensibilité aux mappes de sauvegarde via plusieurs plug-in personnalisés conçus à cet effet. La liste qui suit répertorie les méthodes set
permettant de définir des attributs et fournissant une prise en charge de ces plug-in personnalisés :
// Pour la définition des attributs de BackingMap.
public void setReadOnly(boolean readOnlyEnabled);
public void setNullValuesSupported(boolean nullValuesSupported);
public void setLockStrategy( LockStrategy lockStrategy );
public void setCopyMode(CopyMode mode, Class valueInterface);
public void setCopyKey(boolean b);
public void setNumberOfBuckets(int numBuckets);
public void setNumberOfLockBuckets(int numBuckets);
public void setLockTimeout(int seconds);
public void setTimeToLive(int seconds);
public void setTtlEvictorType(TTLType type);
public void setEvictionTriggers(String evictionTriggers);
// For setting an optional custom plug-in provided by application.
public abstract void setObjectTransformer(ObjectTransformer t);
public abstract void setOptimisticCallback(OptimisticCallback checker);
public abstract void setLoader(Loader loader);
public abstract void setPreloadMode(boolean async);
public abstract void setEvictor(Evictor e);
public void setMapEventListeners( List /*MapEventListener*/ eventListenerList );
public void addMapEventListener(MapEventListener eventListener );
public void removeMapEventListener(MapEventListener eventListener );
public void addMapIndexPlugin(MapIndexPlugin index);
public void setMapIndexPlugins(List /\* MapIndexPlugin \*/ indexList );
public void createDynamicIndex(String name, boolean isRangeIndex,
String attributeName, DynamicIndexCallback cb);
public void createDynamicIndex(MapIndexPlugin index, DynamicIndexCallback cb);
public void removeDynamicIndex(String name);
Il existe une méthode get
pour chacune des méthodes set de la liste ci-dessus.
Attributs BackingMap
Toute mappe de sauvegarde possède
les attributs suivant qu'il est possible de définir pour modifier ou pour contrôler
son comportement :
- ReadOnly : indique si la mappe est en lecture seule ou en lecture-écriture. Si cet attribut n'est jamais défini pour la mappe,
celle-ci est par défaut une mappe en lecture-écriture. Lorsqu'une mappe
est définie comme en lecture seule, ObjectGrid optimise les performances pour ne procéder à des lectures
que lorsque c'est possible.
- NullValuesSupported : indique s'il est possible de placer une valeur null
dans la mappe. Si cet attribut n'est jamais défini, la mappe n'accepte jamais de valeurs
null. Si les valeurs null sont admises par la mappe, une
opération get qui renvoie la valeur null peut signifier que la valeur est
null ou que la mappe ne contient pas la clé spécifiée par l'opération get.
- LockStrategy : détermine si un gestionnaire de verrouillage est utilisée
par cette mappe de sauvegarde. Si un gestionnaire est utilisé, l'attribut LockStrategy
sert à indique quelle approche est adoptée pour le verrouillage des entrées de la mappe : verrouillage optimiste ou verrouillage pessimiste. Si cet attribut n'est pas défini, c'est la stratégie de verrouillage optimiste qui est utilisée. Voir la rubrique Verrouillage pour en savoir davantage sur les stratégies de verrouillage prises en charge.
- CopyMode : détermine si une copie d'un objet value
est effectuée par la mappe de sauvegarde lorsqu'une valeur est lue dans la mappe ou qu'elle est placée dans la mappe
pendant le cycle de validation d'une transaction.
Plusieurs modes de copie sont possibles pour permettre à l'application de trouver
un compromis entre les performances et l'intégrité des données. Si cet attribut n'est pas défini, c'est le mode COPY_ON_READ_AND_COMMIT qui est utilisé. Si ce mode de copie
n'offre pas les meilleures performances, il assure la meilleure protection contre les problèmes d'intégrité des données. Si la mappe de sauvegarde est associée
à une entité d'API EntityManager, le paramètre CopyMode ne prend effet
que si la valeur est définie comme COPY_TO_BYTES. Pour tout autre mode de copie,
la valeur est toujours NO_COPY. Pour remplacer le mode de copie d'une mappe
d'entités, utilisez la méthode ObjectMap.setCopyMode.
Pour plus d'informations sur les modes de copie, voir les Optimisation du mode de copie.
- CopyKey : détermine si la mappe de sauvegarde effectue une copie
d'un objet key lors de la première création d'une entrée dans la mappe. L'action par défaut
est de ne pas faire de copie des objets key car les clés sont normalement des objets
non modifiables.
- NumberOfBuckets : indique le nombre de compartiments de table de hachage
que devra utiliser la mappe de sauvegarde. L'implémentation de BackingMap utilise une table de hachage. S'il existe un grand nombre d'entrées dans la mappe de sauvegarde,
un plus grand nombre de compartiments sera synonyme de meilleures performances. Le nombre de clés
partageant le même compartiment diminue au fur et à mesure que croît le nombre de compartiments. Mais un plus grand nombre de compartiments est également synonyme d'un plus grand nombre d'accès simultanés. Cet attribut est utile
pour une optimisation fine des performances. Une valeur non définie est utilisée par défaut
si l'application ne définit pas l'attribut NumberOfBuckets.
- NumberOfLockBuckets : indique le nombre de compartiments de verrouillage que devra utiliser le gestionnaire de verrouillage pour cette mappe de sauvegarde.
Lorsque la stratégie de verrouillage est définie comme OPTIMISTIC ou PESSIMISTIC,
un gestionnaire de verrouillage est créé pour la mappe de sauvegarde. Le gestionnaire de verrouillage
utilise une table de hachage pour rechercher les entrées verrouillées par une
ou plusieurs transactions.
S'il existe un grand nombre d'entrées dans la table de hachage, les performances seront d'autant meilleures
que les compartiments de verrouillage seront plus nombreux car le risque de collisions de clés au sein du même compartiment
diminue au fur et à mesure que croît le nombre de compartiments. Mais un plus grand nombre de compartiments de verrouillage est également synonyme d'un plus grand nombre d'accès simultanés. Lorsque l'attribut LockStrategy a la valeur NONE,
aucun gestionnaire de verrouillage n'est utilisé par cette mappe de sauvegarde. Dans ce cas,
la définition de numberOfLockBuckets n'a aucun effet. Si cet attribut n'est pas défini, c'est une valeur indéfinie qui est utilisée.
- LockTimeout : utilisé lorsque la mappe de sauvegarde utilise
un gestionnaire de verrouillage. La mappe de sauvegarde utilise un gestionnaire de verrouillage lorsque l'attribut LockStrategy
a la valeur OPTIMISTIC ou PESSIMISTIC. La valeur de cet attribut
est définie en secondes et elle détermine pendant combien de temps le gestionnaire de verrouillage attend
l'octroi d'un verrou. Si cet attribut n'est pas défini, une valeur de 15 secondes
est utilisée pour LockTimeout. Voir Verrouillage pessimiste pour les détails
des exceptions de délai d'attente de verrou qui peuvent se produire.
- TtlEvictorType : toute mappe de sauvegarde a son propre expulseur pré-intégré, qui utilise un algorithme temporel
pour déterminer quelles entrées expulser de la mappe. Par défaut, l'expulseur pré-intégré n'est pas actif. Vous pouvez l'activer en appelant la méthode
setTtlEvictorType avec l'une de ces valeurs : CREATION_TIME,
LAST_ACCESS_TIME, LAST_UPDATE_TIME ou NONE. CREATION_TIME indique que l'expulseur
ajoute l'attribut TimeToLive à l'heure à laquelle l'entrée a été créée dans la mappe
afin de déterminer à quel moment l'expulseur doit expulser l'entrée de la mappe. LAST_ACCESS_TIME (ou LAST_UPDATE_TIME)
indique que l'expulseur ajoute l'attribut TimeToLive à l'heure du dernier accès (ou du dernier accès et de la dernière modification apportée) à l'entrée de mappe
par une transaction qu'exécute l'application. L'entrée de mappe n'est expulsée que si aucune transaction n'y a accédé
pendant la période de temps spécifiée par l'attribut TimeToLive. Enfin, NONE indique à l'expulseur de rester inactif
et de ne jamais expulser aucune des entrées de la mappe. Si cet attribut n'est jamais défini, c'est la valeur NONE qui est utilisée
et l'expulseur n'est pas actif. Voir la section Expulseurs pour plus de détails sur l'expulseur pré-intégré.
- TimeToLive : cet attribut sert à spécifier le nombre de secondes nécessaires à l'expulseur pour ajouter la date de création ou de dernier accès pour chacune des entrées (voir les explications concernant l'attribut TtlEvictorType). Si cet attribut n'est jamais défini, c'est la valeur spéciale de zéro qui est utilisée
pour indiquer que la durée de vie est infinity. Si cet attribut a la valeur infinity,
les entrées de mappe ne sont jamais expulsées.
L'exemple qui suit montre comment définir la mappe de sauvegarde someMap dans l'instance ObjectGrid someGrid
et comment définir divers attributs de cette mappe à l'aide des méthodes set de l'interface BackingMap :
import com.ibm.websphere.objectgrid.BackingMap;
import com.ibm.websphere.objectgrid.LockStrategy;
import com.ibm.websphere.objectgrid.ObjectGrid;
import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
...
ObjectGrid og =
ObjectGridManagerFactory.getObjectGridManager().createObjectGrid("someGrid");
BackingMap bm = objectGrid.getMap("someMap");
bm.setReadOnly( true ); // override default of read/write
bm.setNullValuesSupported(false); // override default of allowing Null values
bm.setLockStrategy( LockStrategy.PESSIMISTIC ); // override default of OPTIMISTIC
bm.setLockTimeout( 60 ); // override default of 15 seconds.
bm.setNumberOfBuckets(251); // override default (prime numbers work best)
bm.setNumberOfLockBuckets(251); // override default (prime numbers work best)
Plug-in BackingMap
L'interface BackingMap
comporte plusieurs points optionnels de connexion de plug-in, qui étendent les possibilités d'interactions avec l'ObjectGrid.
- Plug-in ObjectTransformer: pour un certain nombre d'opérations de mappage, une mappe
peut avoir besoin de sérialiser, désérialiser ou copier une clé ou une valeur d'une entrée de la mappe. Celle-ci peut effectuer ces actions
en fournissant une implémentation par défaut de l'interface ObjectTransformer.
Une application peut améliorer les performances en fournissant un plug-in ObjectTransformer personnalisé
qui sera utilisé par la mappe pour sérialiser, désérialiser ou copier une clé ou une valeur d'une entrée de la mappe.
Voir les Plug-in ObjectTransformer pour plus d'informations.
- Plug-in Evictor : l'expulseur pr-intégré utilise un algorithme temporel
pour décider du moment où une entrée doit être expulsée de la mappe. Certaines applications peuvent avoir besoin d'utiliser un algorithme différent
pour décider de ce moment. Le plug-in Evictor met un expulseur personnalisé à la disposition de la mappe. Le plug-in Evictor vient s'ajouter à l'expulseur pré-intégré. Il ne le remplace pas. ObjectGrid
fournit un plug-in Evictor personnalisé qui implémente des algorithmes bien connus
comme "utilisée le plus récemment" ou "utilisée le moins fréquemment". Les applications
peuvent utiliser l'un des plug-in Evictor fournis ou fournir leur propre plug-in. Voir les Plug-in d'expulsion d'objets du cache.
- Plug-in MapEventListener plug-in : une application peut vouloir être au courant
d'événements affectant la mappe de sauvegarde, comme l'expulsion d'une entrée ou le préchargement
d'une mappe. La mappe de sauvegarde appelle des méthodes du plug-in MapEventListener
pour notifier les applications des événements qui lui sont arrivés. La méthode setMapEventListener
permet aux applications de recevoir des notifications des divers événements arrivant à la mappe de sauvegarde
grâce à un ou plusieurs plug-in MapEventListener personnalisés qu'elle fournit à la mappe. L'application peut modifier
les objets MapEventListener à l'aide des méthodes addMapEventListener
ou removeMapEventListener. Voir les Plug-in MapEventListener pour plus d'informations.
- Plug-in de chargeur : une mappe de sauvegarde est en fait un cache en mémoire d'un objet Map. Un plug-in Loader est une option utilisée par la mappe de sauvegarde
pour déplacer les données entre la mémoire et un stockage de persistance. Ainsi, un chargeur JDBC (Java Database
Connectivity) pourra être utilisé pour échanger des données dans les deux sens entre une mappe de sauvegarde et une ou plusieurs tables
d'une base de données relationnelle. Il n'est en effet pas nécessaire d'utiliser une base de données relationnelle comme stockage de persistance d'une mappe de sauvegarde.
Le chargeur peut également servir à l'échange de données entre une mappe de sauvegarde
et un fichier, entre une mappe de sauvegarde et un certain nombre d'éléments : mappe Hibernate,
bean entity JEE (Java 2
Platform, Enterprise Edition), autre serveur d'applications, etc. Pour chacune des technologies qu'elle utilise, l'application doit fournir
un plug-in Loader personnalisé pour transférer les données entre la mappe de sauvegarde et le stockage de persistance. Si aucun chargeur
n'est fourni, la mappe de sauvegarde devient un simple cache en mémoire. Voir les Plug-in pour communiquer avec les bases de données pour plus d'informations.
- Plug-in OptimisticCallback : lorsque l'attribut LockStrategy
d'une mappe de sauvegarde a pour valeur OPTIMISTIC, la mappe de sauvegarde ou un plug-in Loader doivent effectuer
des opérations de comparaison pour les valeurs contenues dans la mappe. Le plug-in OptimisticCallback est alors utilisé par la mappe
ou par le chargeur pour effectuer des opérations de comparaison en appliquant une vérification optimiste des versions.
Voir les Plug-in de vérification et de comparaison des versions des objets mis en cache pour plus d'informations.
- Plug-in MapIndexPlugin : un plug-in A MapIndexPlugin (ou un Index en abrégé),
est une option utilisée par la mappe de sauvegarde pour élaborer un index
en fonction de l'attribut de l'objet stocké, qui est spécifié.
L'index permet à l'application de trouver des objets à partir d'une valeur ou d'une plage de valeurs
spécifiques. Il existe deux types d'index : statiques et dynamiques.
Pour plus d'informations, voir Indexation.
Pour plus d'informations sur les plug-in, voir la Présentation des plug-in.