Avec les mappes dynamiques, vous pouvez créer des mappes après l'initialisation de la grille de données.
Dans les versions précédentes de WebSphere eXtreme Scale, vous deviez définir les mappes avant d'initialiser la grille d'objets. Vous deviez donc créer toutes les mappes à utiliser avant d'exécuter des transactions dans celles-ci.
L'introduction des mappes dynamiques permet de ne plus avoir à définir toutes les mappes avant l'initialisation. En utilisant des modèles de mappes, vous pouvez créer des mappes après que ObjectGrid a été initialisé.
Les modèles de mappe sont définis dans le fichier XML ObjectGrid. Des comparaisons de modèle sont exécutées lorsqu'une Session demande une mappe n'ayant pas été précédemment définie. Si le nom de la nouvelle mappe correspond à l'expression régulière d'un modèle de mappe, la mappe est créée dynamiquement et elle reçoit le nom de la mappe demandée. Elle hérite de tous les paramètres du modèle de mappe définis dans le fichier XML ObjectGrid.
La création de mappes dynamiques est étroitement associée à la méthode Session.getMap(String). Les appels de cette méthode renvoient une ObjectMap basée sur la mappe de sauvegarde qui a été configurée par le fichier XML ObjectGrid.
La transmission d'une chaîne qui correspond à l'expression régulière d'un modèle de mappe crée une mappe ObjectMap et une mappe BackingMap associée.
Pour plus d'informations sur la méthode Session.getMap(String cacheName), voir la documentation relative aux API.
Définir un modèle de mappe en XML est aussi simple que définir un attribut booléen dans l'élément backingMap. Lorsque le modèle est associé à la valeur true, le nom de la mappe de sauvegarde est interprété comme une expression régulière.
WebSphere eXtreme Scale utilise Java la correspondance de modèle entre expressions régulières. Pour plus d'informations sur le moteur d'expressions régulières dans Java, consultez la documentation relative aux API du package et des classes java.util.regex.
Un exemple de fichier XML ObjectGrid et de modèle de mappe défini est présenté ci-dessous.
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
xmlns="http://ibm.com/ws/objectgrid/config">
<objectGrids>
<objectGrid name="accounting">
<backingMap name="payroll" readOnly="false" />
<backingMap name="templateMap.*" template="true"
pluginCollectionRef="templatePlugins" lockStrategy="PESSIMISTIC" />
</objectGrid>
</objectGrids>
<backingMapPluginCollections>
<backingMapPluginCollection id="templatePlugins">
<bean id="Evictor"
className="com.ibm.websphere.objectgrid.plugins.builtins.LFUEvictor" />
</backingMapPluginCollection>
</backingMapPluginCollections>
</objectGridConfig>
Le fichier XML précédent définit un modèle de mappe et une mappe ne servant pas de modèle. Le nom du modèle de mappe est une expression régulière : templateMap.*. Lorsque la méthode Session.getMap(String) est appelée avec un nom de mappe correspondant à cette expression régulière, l'application crée une mappe.
Vous devez configurer un modèle de mappe pour créer une mappe dynamique. Ajoutez le modèle Boolean à une mappe backingMap dans le fichier XML ObjectGrid.
<backingMap name="templateMap.*" template="true" />
Le nom du modèle de mappe est traité comme une expression régulière.
Lorsque vous appelez la méthode Session.getMap(String cacheName) avec un nom de cache correspondant à l'expression régulière, la mappe dynamique est créée. Un objet ObjectMap est renvoyé par cet appel de méthode et un objet BackingMap associé est créé.
Session session = og.getSession();
ObjectMap map = session.getMap("templateMap1");
La mappe créée est configurée avec tous les attributs et plug-in définis dans la définition du modèle de mappe. Considérez à nouveau le fichier XML ObjectGrid précédent.
Supposons qu'un expulseur soit configuré dans une mappe dynamique créée d'après le modèle de mappe de ce fichier XML et que sa stratégie de verrouillage soit pessimiste.
Tenez compte de la modification du comportement de la méthode Session.getMap(String cacheName) lorsque vous utilisez des modèles de mappes. Avant WebSphere eXtreme Scale version 7.0, tous les appels de la méthode Session.getMap(String cacheName) entraînaient une exception UndefinedMapException si la mappe demandée n'existait pas. Avec les mappes dynamiques, chaque nom correspondant à l'expression régulière d'un modèle de mappe entraîne une création de mappe. Vérifiez que vous notez bien le nombre de mappes créées par votre application, notamment si votre expression régulière est générique.
Par ailleurs, ObjectGridPermission.DYNAMIC_MAP est nécessaire à la création de mappes dynamiques lorsque la sécurité eXtreme Scale est activée. Cette permission est vérifiée lorsque la méthode Session.getMap(String) est appelée. Pour plus d'informations, voir Autorisation du client d'application.
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
xmlns="http://ibm.com/ws/objectgrid/config">
<objectGrids>
<objectGrid name="session">
<backingMap name="objectgrid.session.metadata.dynamicmap.*" template="true"
lockStrategy="PESSIMISTIC" ttlEvictorType="LAST_ACCESS_TIME">
<backingMap name="objectgrid.session.attribute.dynamicmap.*"
template="true" lockStrategy="OPTIMISTIC"/>
<backingMap name="datagrid.session.global.ids.dynamicmap.*"
lockStrategy="PESSIMISTIC"/>
</objectGrid>
</objectGrids>
</objectGridConfig>
<?xml version="1.0" encoding="UTF-8"?>
<deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ibm.com/ws/objectgrid/deploymentPolicy
../deploymentPolicy.xsd"
xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy">
<objectgridDeployment objectgridName="session">
<mapSet name="mapSet2" numberOfPartitions="5" minSyncReplicas="0"
maxSyncReplicas="0" maxAsyncReplicas="1" developmentMode="false"
placementStrategy="PER_CONTAINER">
<map ref="logical.name"/>
<map ref="objectgrid.session.metadata.dynamicmap.*"/>
<map ref="objectgrid.session.attribute.dynamicmap.*"/>
<map ref="datagrid.session.global.ids"/>
</mapSet>
</objectgridDeployment>
</deploymentPolicy>