Wenn eine eXtreme-Scale-Konfiguration eine festgelegte Partitionsverteilungsstrategie verwendet, ist sie vom Hashing des Schlüssels in einer Partition abhängig, um den Wert einzufügen, abzurufen, zu aktualisieren oder zu entfernen. Die Methode "hashCode" wird für den Schlüssel aufgerufen und muss klar definiert sein, wenn ein angepasster Schlüssel erstellt wird. Für die Verwendung der Schnittstelle "PartitionableKey" wird jedoch eine andere Option verwendet. Mit der Schnittstelle "PartitionableKey" können Sie ein anderes Objekt als den Schlüssel für das Hashing in einer Partition verwenden.
Sie können die Schnittstelle "PartitionableKey" verwenden, wenn mehrere Maps vorhanden sind und die Daten, die Sie festschreiben, zusammengehören und deshalb in derselben Partition gespeichert werden sollten. WebSphere eXtreme Scale unterstützt keine zweiphasige Festschreibung. Deshalb sollten nicht mehrere Map-Transaktionen festgeschrieben werden, wenn sie sich auf mehrere Partitionen erstrecken. Wenn PartitionableKey das Hashing für Schlüssel in verschiedenen Maps in demselben MapSet in derselben Partition durchführt, können sie zusammen festgeschrieben werden.
Sie können die Schnittstelle "PartitionableKey" auch verwenden, wenn Gruppen von Schlüsseln in derselben Partition gespeichert werden sollten, aber nicht unbedingt in einer einzigen Transaktion. Wenn das Hashing von Schlüssel auf der Basis von Position, Abteilung, Domänentyp oder einem anderen Typ von Kennung durchgeführt werden soll, können Sie untergeordneten Schlüsseln einen übergeordneten PartitionableKey zuordnen.
Das Hashing für Mitarbeiter sollte beispielsweise in derselben Partition wie bei der zugehörigen Abteilung durchgeführt werden. Jeder Mitarbeiter hat ein PartitionableKey-Objekt, das zur Map "department" gehört. In diesem Fall wird für das Hashing des Mitarbeiters und der Abteilung dieselbe Partition verwendet.
Die Schnittstelle "PartitionableKey" stellt eine Methode bereit, die Methode "ibmGetPartition". Das von dieser Methode zurückgegebene Objekt muss die Methode "hashCode" implementieren. Das von der alternativen Methode "hashCode" zurückgegebene Objekt wird verwendet, um den Schlüssel an eine Partition weiterzuleiten.
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;
// Die Daten, aus denen sich der eigentliche Datenobjektschlüssel zusammensetzt.
public final String realKey;
// Der Schlüssel des Datenobjekts, das Sie für die Weiterleitung verwenden möchten.
// Dies ist gewöhnlich der Schlüssel eines übergeordnetes Objekts.
public final Object keyToRouteWith;
public RoutableKey(String realKey, Object keyToRouteWith) {
super();
this.realKey = realKey;
this.keyToRouteWith = keyToRouteWith;
}
/**
* Hash-Code des Schlüssels zurückgeben, der für die Weiterleitung verwendet wird.
* Falls nicht angegeben, verwendet eXtreme Scale den Hash-Code des Schlüssels THIS.
*/
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;
}
}