Lorsqu'une configuration eXtreme Scale utilise la stratégie FIXED_PARTITION de positionnement, elle dépend du hachage de la clé vers une partition pour insérer, lire, actualiser ou supprimer la valeur. La méthode hashCode est appelée sur la clé et elle doit être correctement définie si une clé personnalisée est créée. Mais il existe une autre possibilité : utiliser l'interface PartitionableKey. Cette interface permet d'utiliser un autre objet que la clé pour le hachage vers une partition.
Vous pouvez utiliser l'interface PartitionableKey dans des cas où il existe des mappes multiples et où les données que vous validez sont liées entre elles et doivent donc être mises dans la même partition. WebSphere eXtreme Scale ne prend pas en charge la validation en deux phases ; c'est pourquoi des transactions de mappes multiples ne doivent pas être validées si elles doivent s'étendre sur plusieurs partitions. Si PartitionableKey hache vers la même partition pour des clés situées dans différentes mappes du même groupe de mappes, ces transactions peuvent être validées ensemble.
Vous pouvez également utiliser l'interface PartitionableKey lorsque des groupes de clés doivent être placés dans la même partition, mais pas nécessairement au cours de la même transaction. Si les clés doivent être hachées en fonction du site, du département, du type de domaine ou de toute autre sorte d'identificateur, les clés enfants peuvent se voir attribuer une clé partitionnable parent.
Par exemple, les employés doivent hacher vers la même partition que leur département. Chaque clé d'employé aura un objet PartitionableKey qui appartient à la mappe Département. Alors, les employés et le département hacheront vers la même partition.
L'interface PartitionableKey fournit une seule méthode, appelée ibmGetPartition. L'objet retourné par cette méthode doit implémenter la méthode hashCode. Le résultat retourné de ce hashCode sera utilisé pour router la clé vers une partition.
package com.ibm.websphere.cjtester;
import java.io.Serializable;
import com.ibm.websphere.objectgrid.plugins.PartitionableKey;
public class RoutableKey implements Serializable, Cloneable, PartitionableKey {
private static final long serialVersionUID = 1L;
// Données qui constituent la clé d'objet de données réelle.
public final String realKey;
// Clé de l'objet de données que vous souhaitez utiliser pour le routage.
// Il s'agit généralement de la clé d'un objet parent.
public final Object keyToRouteWith;
public RoutableKey(String realKey, Object keyToRouteWith) {
super();
this.realKey = realKey;
this.keyToRouteWith = keyToRouteWith;
}
/**
* Retour du code haché de la clé utilisée pour le routage.
* S'il n'est pas fourni, eXtreme Scale utilise le code haché de CETTE clé.
*/
public Object ibmGetPartition() {
return new Integer(keyToRouteWith.hashCode());
}
@Override
public RoutableKey clone() throws CloneNotSupportedException {
return (RoutableKey) super.clone();
}
@Override
public int hashCode () {
final int prime = 31;
int result = 1;
result = prime * result + ((keyToRouteWith == null) ? 0 : keyToRouteWith.hashCode());
result = prime * result + ((realKey == null) ? 0 : realKey.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if ( obj == null ) return false;
if (getClass() != obj.getClass()) return false;
RoutableKey other = (RoutableKey) obj;
if (keyToRouteWith == null) {
if (other.keyToRouteWith != null) return false;
} else if (!keyToRouteWith.equals(other.keyToRouteWith)) return false;
if (realKey == null) {
if (other.realKey != null) return false;
} else if (!realKey.equals(other.realKey)) return false;
return true;
}
}